Vim 命令行模式有哪些常用命令?
Vim 的命令行模式(Command-line Mode)是很多新手容易忽略的一层——按下 : 后底部弹出的那个输入框,藏着远比 :wq 更多的能力。从文件操作到批量替换、从窗口分割到执行 Shell 命令,命令行模式是 Vim 编辑效率的关键倍增器。
如何进入命令行模式
在普通模式下,以下按键会进入命令行模式:
:— 输入 Ex 命令,这是最常用的入口/— 正向搜索- **
?— 反向搜索 !— 在部分场景下直接执行外部命令(如:!ls)
按 Esc 或 Ctrl+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"升级为真正的文本处理工具。