Применение макроса Vim к нескольким строкам

Я сделал простой макрос для увеличения числа в объекте json следующим образом:

{
    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, 150@n

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

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

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

ИЗМЕНИТЬ:

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

{
    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

person ramonovski    schedule 15.03.2013    source источник
comment
Я не понимаю, что вы пытаетесь сделать? Вы просто пытаетесь увеличить число в каждой строке файла? :%norm ^A (^A создается ctrl-q ctrl-a)   -  person Peter Rincker    schedule 16.03.2013
comment
Я думаю, что неправильно понимаю ваш вопрос. Не могли бы вы указать значение регистра 'n', вы можете увидеть его нажатием <C-R>n в режиме вставки   -  person rbernabe    schedule 16.03.2013
comment
Я пытаюсь продублировать объект json, но со значением +1 для изображений, например: foo1.jpg, foo2.jpg, foo3.jpg, foo4.jpg   -  person ramonovski    schedule 16.03.2013
comment
@ramonovski, вы должны голосовать/принимать полезные ответы, чтобы выразить свою признательность. (Но спасибо. тоже приятно ;-))   -  person romainl    schedule 16.03.2013


Ответы (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

затем сделайте 150@n.

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

person romainl    schedule 15.03.2013
comment
Это почти идентично тому, что я придумал. Но что бы мы были без того, чтобы немного поиграть в гольф? Вы можете опустить '[, чтобы сократить его на 2 символа. - person Peter Rincker; 16.03.2013
comment
Мой ответ выглядит как раздутая плагиатная версия вашего комментария. Я не должен пропускать комментарии, прежде чем броситься к форме ответа! - person romainl; 16.03.2013
comment
Я рад, что вы это сделали, потому что ваш макрос был короче моего: qn8yy`]p:,']norm ^Q^A^M[q - person Peter Rincker; 16.03.2013
comment
Большое спасибо, romainl, все работает! Можете ли вы объяснить часть '[,']? Я уже знаю, что означает '‹,'›. - person ramonovski; 16.03.2013
comment
@PeterRincker, возможно, V%y может быть yG? спаси еще один. Хотя я не тестировал. :) - person Kent; 16.03.2013
comment
@ramonovski, '[ и '] — это автоматические метки, созданные Vim в начале и конце только что вставленного текста. - person romainl; 16.03.2013
comment
@kent, вы правы, используя yG, это сняло бы инсульт. Конечно, это означает, что он должен быть в конце файла. Вы можете сделать еще один штрих, изменив диапазон с :norm на ,$. Итого 19: qqyG%p:,$norm ^Q^A%q - person Peter Rincker; 16.03.2013

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

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

:normal @n

Затем, когда вы нажмете Enter, макрос будет применен к выбранным строкам.

person rbernabe    schedule 15.03.2013

Я попробовал:

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

затем сделайте 150@q

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

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

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

person Kent    schedule 15.03.2013
comment
Спасибо, Кент, ваше решение тоже сработало, и я узнал о функции submatch(). - person ramonovski; 16.03.2013

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

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

person Ingo Karkat    schedule 18.03.2013