【问题标题】:How to add line numbers to range of lines in Vim?如何将行号添加到 Vim 中的行范围?
【发布时间】:2010-09-20 03:31:54
【问题描述】:

如何将行号添加到在 Vim 中打开的文件的一系列行中?不像:set nu——这只是显示行号——但实际上是在文件的每一行前面加上它们?

【问题讨论】:

  • 这个问题应该适用于具有行尾标记的任何文件,而不仅仅是源代码文件。

标签: vim line-numbers


【解决方案1】:

:%s/^/\=line('.')/

编辑:总结 cmets。

这个命令可以任意调整。


假设您想在视觉选择的行前添加数字(V + move),并且您希望编号从 42 开始。

:'<,'>s/^/\=(line('.')-line("'<")+42)/

如果您想在数字和行中的旧文本之间添加一个字符串,只需将其连接(在 VimL 中使用 .)到数字表达式:

:'<,'>s/^/\=(line('.')-line("'<")+42).' --> '/

如果您需要将其作为文本排序,您可能希望对结果进行零填充,这可以使用printf 来完成0001, 0002 ...而不是1, 2... 例如:

:%s/^/\=printf('%04d', line('.'))/

无论如何,如果您想了解更多信息,只需打开 vim 帮助::h :s 并点击链接 (|subreplace-special|, ..., |submatch()|)

【讨论】:

  • 尝试在视觉选择上执行此操作(其中 1 将是选择的第一行),但是它从文件中的该行号开始编号。有什么办法可以修改起始号?谢谢!
  • @Jason offset 可以是 1-line("'&lt;")。想知道为什么这么老的问题会出现在我的 RSS 中。
  • 你可以试试:- 文档(:help :s 这里)、vim 技巧(vim.wikia.com)、别人写的插件、vim_use(官方邮件列表)和类似的论坛。跨度>
  • 以防万一其他人需要知道,在数字后添加一个字符串,请执行:%s/^/\=line('.') . 'string'/。就我而言,我需要一个逗号,因为我在 csv 文件中对行进行编号,所以我做了:%s/^/\=line('.') . ','/
【解决方案2】:

cat -n 将行号添加到其输入中。您可以将当前文件通过管道传输到cat -n,并将当前缓冲区替换为打印到标准输出的内容。幸运的是,这个复杂的解决方案在 vim 中少于 10 个字符:

 :%!cat -n

或者,如果您只想要一个子选择,可视化选择区域,然后输入:

 :!cat -n

这将自动放入视觉选择标记,并且在您输入后将如下所示:

 :'<,'>!cat -n

为了删除行号,我推荐使用control-v,它可以让你直观地选择一个矩形,然后你可以用x删除那个矩形。

【讨论】:

  • 如果你希望行号以 0 而不是 1 开头怎么办?
  • 删除第一行,对其余行编号。之后用前导“0”读取第一行。 ;)
  • 这就是答案!
【解决方案3】:

在 GNU 系统上:使用外部 nl 二进制文件:

:%!nl

【讨论】:

  • cool nl -v 允许您指定编号的开始位置,因此如果您希望第一行是第 0 行而不是第 1 行,请使用 nl -v 0
【解决方案4】:

在类 Unix 环境下,您可以使用 cat 或 awk 轻松生成行号,因为 vim 与 shell 有一个友好的接口,所以一切在 vim 中都可以像在 shell 中一样工作。
来自Vim Tip28

:%!cat -n

:%!awk '{print NR,$0}'

但是,如果你在 MS-DOS、win9x、win2000 中使用 vim,你会丢失这些工具包。 这是一个非常简单的方法,只能通过 vim 来存档:

fu! LineIt()
  exe ":s/^/".line(".")."/"
endf

或者,由字母组成的序列就像上面一样简单:

exe "s/^/".nr2char(line("."))."/" 

你也可以使用 subst:

:g/^/exe ":s/^/".line(".")."^I/"

您也可以只打印这些行而不将它们添加到文件中:

“有时它可能很有用,尤其是在编辑大型源文件以在纸上打印行号时。
为此,您可以使用选项:set printoptions=number:y 激活此功能,使用:set printoptions=number:n 停用此功能。
如果要始终打印行号,请将set printoptions=number:y 行放在vimrc 中。"

【讨论】:

  • 在第一个示例中,您的意思是“猫”而不是“呼叫”吗?
  • @Lance:两年后,我不太确定:这篇文章的修订版 3 显示我将更正从 cat 恢复为 call...(来源可能是 Vim tip28,如neuron.tuke.sk/~hudecm/VimTips-OFFLINE-nov02.txt)
  • 好的,awk 行是我需要的。你知道我将如何实现它,以便它给我 3 或 4 个字母数字,比如以 100 或 1000 开头?
  • 按照参考文献使它看起来应该是猫。我发现 awk 语句可以给我更多的数字::%!awk '{print 1000+NR*10,$0}'。现在唯一的问题(不是很多)是我的剥离语句 :%s/^[0-9]*// 在前面留下了额外的空格,并且引用 \s 似乎没有帮助。跨度>
  • @Lance:好的,我已经相应地编辑了答案。您的具体问题可以在此页面中得到自己的答案;)
【解决方案5】:

首先,如果需要,您可以删除现有的行号:

:%s/^[0-9]*//

然后,您可以添加行号。 NR 指的是从一开始的当前行号,因此您可以对其进行一些数学运算以获得您想要的编号。以下命令为您提供四位数的行号:

:%!awk '{print 1000+NR*10,$0}'

【讨论】:

    【解决方案6】:

    "VisIncr" 插件非常适合插入一般递增的数字列(或字母、日期、罗马数字等)。您可以控制数字格式、填充等。因此,在每一行前面插入一个“1”(通过:s:g 或视觉块插入),在视觉块模式下突出显示该列,然后运行插件中的命令之一。

    【讨论】:

      【解决方案7】:

      如果有人想在使用this excellent answer 插入行号后放置一个制表符(或一些空格),这是一种方法。进入逃生模式后,执行:

      :%s/^/\=line('.').'    '/
      

      ^ 表示行首,%s 是替换指令。因此,我们说在每行的开头放置一个行号并添加 4 个空格,然后在替换之前放置该行的内容,并对文件中的所有行执行此操作。

      这将自动替换它。或者,如果您希望命令要求您确认,请执行以下操作:

      :%s/^/\=line('.').'    '/igc
      

      P.S: vim 的威力 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2011-01-02
        • 1970-01-01
        • 2015-07-27
        • 2021-12-29
        • 1970-01-01
        相关资源
        最近更新 更多