将Vim宏应用于多行

时间:2013-03-15 19:58:32

标签: json vim macros

我创建了一个简单的宏来增加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

(对不起,如果这不是在SE中发布vim宏的合适语法)

它的确有效,但直到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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

试试这个:

进入可视模式并选择要包含在宏执行中的行类型:

:normal @n

然后,当您按Enter键时,宏将应用于选定的行

答案 2 :(得分: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

然后执行150@q

如果您录制同一个宏,请只需^M

输入Enter

如果您通过@q

将宏指定为^M类型<c-v><enter> 顺便说一句,这不会赢得高尔夫,因为函数名submatch(0)太长了......:)

答案 3 :(得分:0)

使用我的UnconditionalPaste plugin,一旦您将原始块移动到一个寄存器中,您就可以使用[N]简单地粘贴[N]gPp个自动递增的块(按行与所有数字粘贴递增)。

该插件还允许对文本粘贴方式进行其他几种操作。