Приложете 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
Това е почти идентично с това, което измислих. Но къде щяхме да бъдем без малко vim golf? Можете да изпуснете '[, за да го съкратите с 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