假设我输入了以下内容
a + 1 =b and a+1=c
我还需要 2 个这样的表达式,但我想将 1 的值增加到 3,因此我又复制粘贴了上面的表达式 2 次,并手动将值增加了 1,因此现在我的文件如下所示
a + 1 =b and a+1=c
a + 2 =b and a+2=c
a + 3 =b and a+3=c
有没有办法自动完成这个?有点像搜索和替换,只不过我必须搜索表达式而不是字符,因为1
写的是其他我不想更改的表达式。我想将每行的值更改为 1。每个表达式都在一个新行上。
答案1
Vim 有一种方法可以自动增加数字:<c-a>
(或Ctrla)在正常模式下。
因此,使用宏,在 Vim 中构建递增的数字序列相当容易。从包含a+ 1 =b and a+1=c
和的行开始:
qq
Yp^Aw^A
q
代表^A
按下Ctrla。然后使用@q
重复该宏。因此4@q
将产生:
a + 1 =b and a+1=c
a + 2 =b and a+2=c
a + 3 =b and a+3=c
a + 4 =b and a+4=c
a + 5 =b and a+5=c
答案2
除了使用宏之外,您还可以使用查找和替换
yy2p
:%s/\v\d+/\=line('.')/g
yy2p
拉线并越过它两次:%s
开始搜索并替换\v\d+
搜索所有数字字符\=line('.')
评估线函数作为所有匹配的替代
另一个选择是
:pu! =map(range(1,3), 'printf(''a + %d =b and a+%d=c'', v:val, v:val)')
虽然很难记住,但您不必提取、搜索或宏任何内容。从一个空缓冲区开始,您只需一个命令即可获得整个内容。
答案3
许多 vim 发行版都带有内置 Perl 支持。
如果是这种情况,您可以:
:perldo s/a\+1=b and a\+1=c/sprintf('a+%d=b and a+%d=c',++$aux,$aux)/e
(我可能改变了示例中的空格......)