4

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

4

3 回答 3

6

您想实际插入行号,而不仅仅是在边距中显示它?如果是这样 -

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

这会将其附加到行尾。将 $ 替换为 ^ 以添加到该行的前面。

于 2009-02-23T20:13:10.833 回答
4

首先:以下假设您使用的是 vim,而不是 vi 或类似的工作或 Heirloom 项目 vi。

这里有几个选项:

首先,如果您要使用:s,则将光标放在您选择的行上,然后:

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

where<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>

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

于 2009-02-23T20:14:54.027 回答
1

我试过了

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

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

以下对我有用。

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

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

于 2011-06-01T10:07:36.733 回答