在 Vim 中编辑代码、配置文件或脚本时,行号能让你更轻松地跳转到指定行、排查错误,以及与同伴讨论改动。

Vim 默认不显示行号。你可以在当前会话中用 :set number 启用,或在每次打开文件时都显示——只需把 set number 加入你的 .vimrc 文件。

本指南将介绍如何在 Vim 和 Vi 中显示、隐藏和切换行号,以及如何让该设置成为默认行为。

快速参考

如需可打印的速查表,请参阅 Vim 速查表。

任务命令
显示绝对行号:set number
隐藏绝对行号:set nonumber
切换绝对行号显示:set number!
显示相对行号:set relativenumber
隐藏相对行号:set norelativenumber
显示混合行号:set number relativenumber
查看当前绝对行号设置:set number?
查看是谁修改了某设置:verbose set number?
默认显示行号(Vim)在 ~/.vimrc 中加入 set number
经典 vi 默认显示行号在 ~/.exrc 中加入 set number
Neovim 默认显示行号在 ~/.config/nvim/init.lua 中加入 vim.opt.number = true

绝对行号

绝对行号会在每一行文本旁显示其真实的行号。

要启用行号,需设置 number 标志:

  1. Esc 键切换到普通模式。
  2. :(冒号),光标会移动到屏幕左下角。输入 set numberset nu,然后按 Enter。vi :set number
  3. 行号将显示在屏幕左侧:

Vim enable line numbers

Vim show line numbers

要关闭绝对行号,可运行 :set nonumberset nonu 命令:

:set nonumber

也可以用 :set number!:set nu! 来切换行号的显示:

:set number!

以上命令都只在当前 Vim 会话内有效。一旦关闭编辑器,设置就会失效。若希望每次打开文件都保留行号,请参阅下文“默认显示行号”。

相对行号

启用相对行号后,当前行显示为 0。当前行上方和下方的行会依次递增编号(1、2、3 等)。

相对行号自 Vim 7.3 起引入,Neovim 同样支持。经典 vi 支持 number 但不支持 relativenumber;BusyBox vi 则两项都不支持。

相对行号模式非常实用,因为 Vim 的许多操作(例如上下移动、删除行)都是基于相对行号进行的。

例如,要删除当前行及其下方 10 行,可使用 d10j。Vim 的行级移动包含两端,因此该命令总共删除 11 行。相对行号能让你在执行命令前就看清那 10 个目标行。

要启用相对行号,切换到命令模式并输入 :set relativenumber:set rnu

:set relativenumber

Vim relative line numbers

要关闭相对行号,可输入 :set norelativenumberset nornu

:set norelativenumber

要切换相对行号的显示,可使用 :set relativenumber!:set rnu! 命令:

:set relativenumber!

你可以用以下命令查看当前设置:

:set relativenumber?

混合行号

在 Vim 7.4 及更高版本中,同时启用绝对行号和相对行号即可进入混合行号模式。

混合行号与相对行号基本相同,唯一区别在于:当前行不再显示 0,而是显示其绝对行号。

要开启混合行号,需同时运行 number 和 relativenumber 两条命令:

:set number relativenumber

简写形式为:

:set nu rnu

Vim hybrid line numbers

Vim 会把光标所在行的行号在列中左对齐显示,而其周围的相对行号保持右对齐。正是这点细微差别,让你一眼就能分辨自己位于哪一行。

也可以逐条执行这两条命令来达到相同效果:

:set number
:set relativenumber

要关闭混合模式,需同时关闭绝对行号和相对行号:

:set nonumber norelativenumber

默认显示行号

:set number 这样的命令只在当前 Vim 会话内有效。若希望每次打开 Vim 都显示行号,需将该设置加入你的 .vimrc 文件。

打开 Vim 配置文件:

vim ~/.vimrc

大多数系统并不自带 ~/.vimrc,因此 Vim 会打开一个空缓冲区,并在你保存时写入该文件。这正是设置重启后失效的常见原因:命令只是在 : 提示符下输入,却从未写入配置文件。

加入这一行即可默认启用绝对行号:

set number

如果你更习惯相对行号,则加入:

set relativenumber

若想要混合编号(当前行显示绝对行号、邻近行显示相对行号),则同时加入这两行设置:

set number

set relativenumber

若要用一个按键来切换行号,可加入如下映射:

nnoremap <F2> :set number!<CR>

:x 保存并退出,然后重新打开任意文件确认行号已生效。如果你是 Vim 新手,保存与退出 Vim 一文详细介绍了写入和退出命令。

经典 Vi

经典 vi 读取的是 ~/.exrc 而非 ~/.vimrc。将同样的设置加入该文件:

set number

这样会在提供 number 选项的 vi 实现中启用绝对行号。BusyBox vi 不提供该选项,因此无法显示行号列。

Neovim

Neovim 默认不读取 ~/.vimrc。在 Linux 上,它会在 $XDG_CONFIG_HOME/nvim 中寻找 init.luainit.vim。若未设置 XDG_CONFIG_HOME,该目录默认为 ~/.config/nvim。可在 Neovim 内运行 :echo stdpath('config') 来确认当前生效的目录。

下面的示例使用了默认的 ~/.config/nvim 路径。若该目录不存在请先创建,然后通过 vim.opt 设置选项:

vim.opt.number = true

vim.opt.relativenumber = true

Neovim 同样支持 Vimscript 配置。init.vim 中的语法与你在 .vimrc 里书写的完全相同:

set number

只保留其中一个文件。若两者同时存在,Neovim 会拒绝启动并报错 E5422: Conflicting configs

系统级设置

若要让机器上的所有用户都启用行号,应编辑系统级配置文件,而非你个人的配置。在 Debian 和 Ubuntu 上该文件为 /etc/vim/vimrc,在 Fedora 和 RHEL 上则为 /etc/vimrc

sudo vim /etc/vim/vimrc

Vim 会先读取系统文件,再读取你个人的 ~/.vimrc,因此任何用户仍可以自行关闭行号。

故障排查

关闭 Vim 后行号消失:set number 只作用于当前会话。把 set number 写入 ~/.vimrc,让该选项在启动时自动生效,并用 ls -l ~/.vimrc 确认文件确实存在。

设置已写入 .vimrc 但 Vim 仍忽略它:在 Vim 内运行 :verbose set number?。它会打印当前值,以及最后设置该值的文件和行号。若结果显示来自某个插件或 /usr/share/vim 下的文件,说明有内容在你的 .vimrc 之后加载并覆盖了该选项。

在 Vim 中能显示行号,但用 sudo 打开时却不行:sudo vim 以 root 身份运行编辑器,而在通常的 env_reset sudo 配置下,HOME 指向 root 的家目录,因此 Vim 读取的是 /root/.vimrc 而非你的配置。可使用 sudoedit /path/to/file 以你自己的身份和配置来编辑文件。

无法使用相对行号:relativenumber 需要 Vim 7.3 或更高版本。经典 vi 通过 number 支持绝对行号,而 BusyBox vi 两种编号都不支持。如果 :set number 也失败,请改用完整的 Vim,而非精简版 vi 实现。

行号列占用空间过大:该列默认宽度为 4 个字符,当文件超过 999 行时会自动变宽。可用 :set numberwidth=3 收窄,或为超长文件设宽至最多 20。

总结

在需要为当前 Vim 会话显示绝对行号时,使用 :set number;若希望 Vim 每次启动都显示行号,则把 set number 加入 ~/.vimrc。相对行号在范围命令中收益最大,例如在 Vim 中批量注释多行。