5月27日 15:05

Vim 命令行模式有哪些常用命令?

Vim 的命令行模式(Command-line Mode)是很多新手容易忽略的一层——按下 : 后底部弹出的那个输入框,藏着远比 :wq 更多的能力。从文件操作到批量替换、从窗口分割到执行 Shell 命令,命令行模式是 Vim 编辑效率的关键倍增器。

如何进入命令行模式

在普通模式下,以下按键会进入命令行模式:

  • : — 输入 Ex 命令,这是最常用的入口
  • / — 正向搜索
  • **? — 反向搜索
  • ! — 在部分场景下直接执行外部命令(如 :!ls

EscCtrl+c 可退出命令行模式回到普通模式。

命令行底部会显示一个输入区域,你输入的内容称为"命令行",Vim 会解析并执行。

文件操作命令

文件操作是命令行模式最基础也最常用的功能:

命令作用
:w保存当前文件
:w filename另存为新文件
:q退出当前缓冲区
:q!强制退出,丢弃修改
:wq:x保存并退出
:e filename打开文件编辑
:e!重新加载文件,丢弃当前修改
:r filename将文件内容插入到光标下方
:sav filename相当于 :w filename 后切换到新文件

几个容易混淆的区别:

  • :x:wq 的差异::x 仅在文件有修改时才写入,时间戳不会无谓更新。
  • :e! 是"撤销一切"的最狠方式,比反复按 u 更彻底。
  • :r 是 insert 的意思,在光标行下方插入文件内容,不是"打开"。

行范围与地址

Ex 命令的强大在于可以指定行范围,对指定行批量操作:

范围写法含义
:3仅操作第 3 行
:1,10第 1 到第 10 行
:1,$第 1 行到文件末尾
:%等同 1,$,整个文件
:.,+5当前行到下面 5 行
:'a,'b标记 a 到标记 b 之间的行

常见组合:

vim
:1,10d " 删除第1到10行 :%d " 删除整个文件内容 :5,20m30 " 将5-20行移动到第30行之后 :1,5t10 " 将1-5行复制到第10行之后 :%normal A; " 在每一行末尾加分号(执行普通模式命令)

:% 是最高频的范围写法,尤其在配合替换命令时几乎必用。

搜索与替换

搜索替换是命令行模式的核心能力,也是面试常考点。

替换命令 :s

基本语法::[范围]s/模式/替换/标志

vim
:s/foo/bar/ " 当前行,替换第一个匹配 :s/foo/bar/g " 当前行,替换所有匹配 :%s/foo/bar/g " 全文替换 :%s/foo/bar/gc " 全文替换,每次确认 :5,10s/foo/bar/g " 第5-10行替换

常用标志:

  • g — 替换行内所有匹配(不加则只替换第一个)
  • c — 每次替换前确认
  • i — 忽略大小写
  • I — 区分大小写

分隔符不限于 /,如果模式本身包含 /,可以换用其他字符:

vim
:%s#/usr/local#/opt/homebrew#g " 用 # 当分隔符

全局命令 :g:v

:g 对匹配行执行命令,:v 对不匹配行执行命令:

vim
:g/pattern/d " 删除所有包含 pattern 的行 :g!/pattern/d " 删除所有不包含 pattern 的行 :v/pattern/d " 同上,:v 等价 :g! :g/^$/d " 删除所有空行 :g/pattern/s/old/new/g " 对匹配行执行替换 :g/pattern/normal @q " 对匹配行执行宏

:g 的语法是 :[范围]g/模式/命令,它是 Vim 里最接近"脚本"能力的东西——批量操作利器。

窗口命令

Vim 支持多窗口编辑,这些命令在命令行模式中输入:

命令作用
:split:sp水平分割窗口
:vsplit:vsp垂直分割窗口
:sp filename水平分割并打开文件
:vsp filename垂直分割并打开文件
:close关闭当前窗口
:only关闭其他所有窗口
:resize +5当前窗口高度增加5行
:resize -5当前窗口高度减少5行
:vertical resize 80当前窗口宽度设为80列

窗口间移动用 Ctrl+w 系列快捷键(Ctrl+w h/j/k/l),不属于命令行命令,但经常配合使用。

缓冲区管理

Vim 的缓冲区(Buffer)是比窗口更底层的概念——你可以打开多个文件但不一定要显示它们:

命令作用
:ls列出所有缓冲区
:b N切换到第 N 号缓冲区
:bn下一个缓冲区
:bp上一个缓冲区
:bd关闭当前缓冲区
:bd N关闭第 N 号缓冲区
:bufdo %s/old/new/g对所有缓冲区执行替换

:ls 的输出中,% 表示当前缓冲区,# 表示轮换缓冲区(按 Ctrl+^ 可快速切换),a 表示已激活。

实际开发中,常用 :bn:bp 在多个文件间快速跳转,比反复 :e 高效。

执行外部命令

Vim 可以在命令行模式中直接调用 Shell:

vim
:!ls " 查看目录列表 :!python3 % " 用 Python 运行当前文件(% 代表当前文件名) :!make " 执行 make :shell " 进入一个子 Shell(exit 返回 Vim)

将外部命令输出插入当前文件:

vim
:read !date " 在光标下方插入当前日期 :r !ls -la " 在光标下方插入目录列表 :5read !whoami " 在第5行后插入命令输出

注意 :!cmd:read !cmd 的区别:前者只显示结果,后者把结果插入文件。

还有一个实用技巧——把当前缓冲区的部分内容作为外部命令的输入:

vim
:1,10!sort " 将1-10行通过 sort 命令排序后替换原内容 :%!jq . " 用 jq 格式化整个 JSON 文件

这种"过滤"用法在处理日志、格式化代码时非常方便。

命令行补全

命令行模式下有两个关键补全快捷键:

  • Tab — 补全命令名、文件名、选项名等
  • Ctrl+d — 列出所有可能的补全候选项
vim
:e<Tab> " 补全以 e 开头的命令 :e /etc/pa<Ctrl+d> " 列出 /etc 下以 pa 开头的文件 :set inc<Tab> " 补全选项名(如 incsearch)

Vim 还支持自定义补全来源,:set wildmenu 开启后,底部会显示一个可导航的补全菜单,配合方向键选择更直观。

命令历史

命令行模式维护了独立的历史记录:

  • q: — 打开命令行历史窗口,可浏览和编辑历史命令
  • q/ — 打开搜索历史窗口
  • q? — 打开反向搜索历史窗口

在历史窗口中,可以用 j/k 浏览,Enter 执行选中的命令,Ctrl+c 退出。

上下方向键也可以在命令行中逐条回溯历史,与 Shell 的体验一致。

建议配合 :set history=200 增大历史记录条数(默认 50),方便回溯更早的命令。

映射与缩写

命令行模式也用于定义快捷映射和缩写:

映射 :map 系列

vim
:map <F5> :w<CR> " 普通/可视/选择/操作符等待模式映射 :nmap <F5> :w<CR> " 仅普通模式 :imap jj <Esc> " 仅插入模式 :vmap <C-c> y " 仅可视模式 :nnoremap <F5> :w<CR> " 非递归普通模式映射(推荐)

实际开发中,始终优先使用 noremap 系列nnoremap/inoremap/vnoremap),避免递归映射导致的问题。

缩写 :abbr 系列

vim
:iab adn and " 插入模式将 adn 自动展开为 and :iab @@ user@example.com " 快速输入邮箱 :ab mainfn int main() " 缩写展开

缩写在输入空格或回车时触发,适合常用代码片段或容易拼错的单词。


Vim 命令行模式本质上是 ex 编辑器的接口——ex 是 Vi 的行编辑器前身,所有 : 命令都是 ex 命令。理解这一点后,你会发现 Vim 的命令行模式并不是一个"输入框"那么简单,而是一个完整的行编辑器,可以精确地对任意行范围执行操作。掌握行范围、替换和 :g 命令,命令行模式就能从"只会 :wq"升级为真正的文本处理工具。

标签:Vim