2013-03-15 4 views
1

я сделал простой макрос для увеличения числа в объект JSON, как это:Применить макрос Vim на несколько строк

{ 
    image: 'images/2.jpg', 
    thumb: 'images/2-thumb.jpg', 
    big: 'images/2.jpg', 
    title: '', 
    description: '', 
    link: 'images/2.jpg' 
}, 

с:

q, n, shift-v, down-till-end, p, move-to-numbers, c-a, return-to-top, q, [email protected] 

(Извините, если это не соответствующий синтаксис для размещения макросов vim здесь, в SE)

И он работает, но он делает прирост только до 9-го. Что мне не хватает?

Заранее спасибо.

EDIT:

Я пытаюсь достичь чего-то вроде этого:

{ 
    image: 'images/3.jpg', 
    thumb: 'images/3-thumb.jpg', 
    big: 'images/3.jpg', 
    title: '', 
    description: '', 
    link: 'images/3.jpg' 
}, 
{ 
    image: 'images/4.jpg', 
    thumb: 'images/4-thumb.jpg', 
    big: 'images/4.jpg', 
    title: '', 
    description: '', 
    link: 'images/4.jpg' 
}, 
... until *nth* value 
+1

Я не понимаю, что вы пытаетесь сделать? Вы просто пытаетесь увеличить число в каждой строке файла?':% norm^A' ('^A' создается ctrl-q ctrl-a) –

+0

Я думаю, что неправильно понимаю ваш вопрос. Не могли бы вы указать значение регистра «n», вы можете увидеть его нажатие « n' в режиме вставки – rbernabe

+0

Я пытаюсь« дублировать »объект json, но с« +1 »значением на изображениях, например : foo1.jpg, foo2.jpg, foo3.jpg, foo4.jpg – ramonovski

ответ

4

Если предположить, что курсор находится на первой открывающей скобки, вот один из способов сделать это:

qn     " start recording in register n 
V%     " select from here to the closing bracket, linewise 
y      " yank the selection 
%      " jump to the closing bracket 
p      " paste after the current line 
:'[,']norm <C-v><C-a> " executing the normal mode command <C-a>(1) on all the lines that we just pasted 
q      " stop recording 

[email protected] затем сделать.

(1) <C-v><C-a> Используется для ввода литетера. ^A.

+1

Это почти идентично тому, что я придумал. Но где же мы будем играть в гольф? Вы можете удалить '' [', чтобы сократить его на 2 символа. –

+0

Мой ответ выглядит как раздутая плагиатная версия вашего комментария. Я не должен пропускать комментарии, прежде чем спешить с формой ответа! – romainl

+0

Я рад, что вы сделали, потому что ваш макрос был короче моего: '' qn8yy' p:, '] norm^Q^A^M [q'' –

1

Попробуйте это:

Введите визуальный режим и выбрать строки, которые будут включены в выполнение макросов a тип:

:normal @n 

, Когда вы нажмете ввести, то макрос будет применен к выбранным линиям

0

Я дал ему попробовать:

qqv%:s/\d\+/\=submatch(0)+1/^M[[yGGp 

краткое объяснение

qq        "recording to register q 
v%        "select things between { and } 
:s/\d\+/\=submatch(0)+1/^M  "just do +1 to all numbers (selected range) 
[[        "back to begin { 
yG        "yank till the end 
Gp        "paste at the end 

затем сделать [email protected]

, если записать один и тот же макрос, типа ^M просто Enter

если вы назначаете макрос @q типа ^M по <c-v><enter>

Кстати, это не будет выигрывать в гольф, так как имя функции submatch(0) слишком долго ... :)

+0

Спасибо, Кент, ваше решение тоже работало, и я узнал о функции подкачки(). – ramonovski

0

UnconditionalPaste plugin С моим, как только вы рывком исходного блока в регистр, вы можете вставить [N] автоинкрементных блоков просто с [N]gPp (паста в листе со всеми номерами, увеличивающимися).

Плагин также позволяет несколько других манипуляций способом вставки текста.

Смежные вопросы