Vi替换命令

时间:2009-02-23 20:04:29

标签: editor command vi substitution

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

3 个答案:

答案 0 :(得分:6)

您想要物理插入行号,而不只是在边距中显示它?如果是的话 -

:s/$/\=line(".")/

这会将它附加到该行的末尾。将$替换为^以前置到该行。

答案 1 :(得分:4)

首先:以下假设您使用的是vim,而不是vi或workalike或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>

不要将silent属性添加到cmap行:它会禁止将行输出到您正在键入的命令中,直到退格为止。

答案 2 :(得分:1)

我试过

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

但是,当我在每一行上发出命令(1)时,用当前行的编号替换了文本,而不是为每一行使用不同的编号。

以下对我有用。

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

g/^/exec在与正则表达式/^/匹配的每一行(即每一行)上执行给定命令。然后在正在处理的行的范围内计算表达式line("."),而不是在键入命令时范围内的行。