vim:逐行更改变量值

vim:逐行更改变量值

假设我输入了以下内容

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
  • qq启动宏(q) 保存在寄存器中q
  • Y拉取当前行(逐行)
  • p粘贴后您将到达下一行(以前是当前行)的开头。
  • <c-a>你增加行中的第一个数字(并且光标移动到它)
  • 因此您移动到下一个单词并再次增加(w<c-a>),这一次影响第二个数字。

答案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

(我可能改变了示例中的空格......)

相关内容