在 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 标志:
- 按
Esc键切换到普通模式。 - 按
:(冒号),光标会移动到屏幕左下角。输入set number或set nu,然后按Enter。vi:set number - 行号将显示在屏幕左侧:


要关闭绝对行号,可运行 :set nonumber 或 set 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

要关闭相对行号,可输入 :set norelativenumber 或 set nornu:
:set norelativenumber
要切换相对行号的显示,可使用 :set relativenumber! 或 :set rnu! 命令:
:set relativenumber!
你可以用以下命令查看当前设置:
:set relativenumber?
混合行号
在 Vim 7.4 及更高版本中,同时启用绝对行号和相对行号即可进入混合行号模式。
混合行号与相对行号基本相同,唯一区别在于:当前行不再显示 0,而是显示其绝对行号。
要开启混合行号,需同时运行 number 和 relativenumber 两条命令:
:set number relativenumber
简写形式为:
:set nu rnu

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.lua 或 init.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 中批量注释多行。