短松江月

在 Vim 中给文本添加序号

· simons ·
vim

在 Vim 中有多种给文本添加序号的方法,以下是最常用的几种:

方法一:使用 :s 替换命令配合表达式(推荐)

1. 基础数字序号

:%s/^/\=line('.').'. '/                                     " 给所有行添加 '1. ' '2. ' 格式序号
:1,10s/^/\=line('.').'. '/                                  " 给第1-10行添加序号
:.,.+39s/^/\=(line('.')-line('.')).' '/g                    " 从当前光标开始

2. 自定义格式的序号

" 添加带括号的序号:(1)、(2)...
:%s/^/\='('.line('.').') '/

" 添加两位数字序号:01、02...
:%s/^/\=printf('%02d. ', line('.')-line("'<")+1)/

方法二:使用宏录制(适用于复杂情况)

  1. 在第一行按 qq 开始录制到寄存器 q
  2. I1. 添加序号(注意有空格)
  3. <Esc> 然后 j 到下一行
  4. q 结束录制
  5. 执行 10@q 给后续10行添加递增序号

方法三:使用 :g 全局命令

" 给所有非空行添加序号
:let i=1 | g/^/s/^/\=printf('%d. ', i)/ | let i=i+1

方法四:使用外部命令(Linux/macOS)

" 使用 nl 命令
:%!nl -ba -w2 -s'. '    " -ba 所有行编号,-w2 宽度2,-s'. ' 分隔符

" 使用 cat 命令
:%!cat -n                 " 简单添加行号
:%!cat -n | sed 's/^ */& /'  " 调整格式

方法五:使用插件

如果经常需要编号,可以安装插件:

  • vim-renumber:专门的重新编号插件
  • visincr:支持多种递增模式

实用示例

示例1:给选中区域添加序号

1. 进入可视模式(V)
2. 选择多行
3. 输入 :'<,'>s/^/\=line('.').'. '/

示例2:从特定数字开始编号

" 从数字5开始编号
:let n=5 | %s/^/\=printf('%d. ', n)/ | let n=n+1

示例3:仅给特定模式的行编号

" 只给以大写字母开头的行编号
:let i=1 | g/^[A-Z]/s/^/\=printf('%d. ', i)/ | let i=i+1

小技巧

  • 使用 Ctrl+R = 可以插入表达式计算结果
  • :set number 可以显示行号(仅显示,不实际插入文本)
  • 对于大量行的编号,方法一通常最有效率