Vi替换命令

4

使用vi编辑器,如何将当前行号替换到当前行的某个位置?例如,如果光标在第10行,我想在该行的某个位置放置数字10。

3个回答

6
您想要插入行号而不仅仅是在边距中显示它吗?如果是这样 -
:s/$/\=line(".")/

这将把它添加到行的末尾。将$替换为^以在行前添加。


4

首先,以下内容假设您正在使用vim,而不是vi或类似vi的软件或Heirloom项目vi。

这里有几个选项:

首先,如果您要使用:s命令,请将光标放在您选择的行上,并执行以下操作:

:s/texttoreplace/<C-R>=line(".")<CR>/

其中<C-R>=表示实际按下Ctrl-R,然后输入一个等号。提示符会改变,然后您可以输入:

line(".")

然后按下回车键,如<CR>所示。此时您将回到:s命令并插入行号。您也可以在插入模式下使用相同的技巧(<C-R>=line(".")<CR>)。
其次,您可以使用\=以相同的方式在正则表达式中插入行号,但这在插入模式或其他地方不起作用。
最后,如果您希望在插入和命令行模式中使用Ctrl-A来插入当前行号,这些都是有用的。
:imap <silent> <C-A> <C-R>=line(".")<CR>
:cmap <C-A> <C-R>=line(".")<CR>

不要在行中添加静默属性:它会抑制该行输出到您正在输入的命令中,直到您使用退格键。

1

我尝试过

:s/texttoreplace/<C-R>=line(".")<CR>/

但是这个命令将每一行的文本替换为我发出命令时所在行的行号(1),而不是为每一行使用不同的行号。

以下方法适用于我。

g/^/exec "s/texttoreplace/(".line(".")."/"

g/^/exec 命令会在每一行匹配正则表达式 /^/(即每一行)时执行给定的命令。然后,在处理该行时,表达式 line(".") 会在该行的作用域中进行评估,而不是在输入命令时的作用域中进行评估。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接