☰
Vim 常用命令与快捷键实战指南:从入门到高效编辑
2026/9/28 5:46:18 网站建设 项目流程

我到现在都记得第一次被人按着在Linux服务器上改配置文件的场景:没有鼠标、没有图形界面,只有一个黑乎乎的终端,里面等着我的是一个叫 vim 的东西。旁边的老同事丢下一句“按 i 插入,按 Esc 返回,按 :wq 保存退出”就走了。后来的情形和很多 Vim 使用者一样:刚开始觉得反人类,用熟了以后彻底离不开。这篇就是我自己多年使用经验的整理,Vim 常用命令和快捷键看着多,但其实全靠“操作符 + 动作”一条规律撑着,并不需要死记硬背。新手可以按顺序读完,老手可以直接跳到平时薄弱的环节查阅。

这篇覆盖的面比较全,但我不会做成罗列上千条命令的字典式整理,而是把高频、易错、真正有用的挑出来,配上踩坑记录和实操心得。适合刚接触 Linux 服务器、需要在终端里改文件的开发者,也适合日常用 IDEA、VS Code 的 Vim 插件但总觉得不顺手的人。读的时候只要手边有个终端,边看边试,效果是最好的。

1. Vim 与 Vi 的区别:模式化编辑到底是怎么回事

很多人一开始被劝退,是因为 Vim 跟普通编辑器完全不一样。打开记事本或者 IDE,你随手敲的字直接进到文本里,方向键和鼠标想怎么点怎么点。但 Vim 不一样,它先把你放进“普通模式”,这时候你敲字母不是在输入文字,而是在发给编辑器指令。说白了,Vim 认为你的手应该一直放在键盘主区域,眼睛不用离开屏幕,也不用去摸鼠标。

1.1 四种模式与切换入口

Vim 有四种基本模式,新手搞清楚这四个就成功了一半:

  • 普通模式(Normal Mode):打开文件后的默认状态。所有移动、删除、复制、粘贴快捷键都在这个模式执行。
  • 插入模式(Insert Mode):真正往文件里敲字的模式。按i进入,按Esc返回普通模式。
  • 可视模式(Visual Mode):用来选择一块文本,之后可以复制、删除、替换。按v进入,按Esc退出。
  • 命令行模式(Command-line Mode):通过:进入,用来执行保存、退出、查找替换等命令。

新手最直观的困惑是“为什么不能直接打字”,反过来想:正因为普通模式下所有键都是命令,你才能实现那些一看就眼花的操作。三四个按键就能完成一次跨文件的替换,代价就是你得先学会这套命令的语法。

1.2 快捷键组合背后的统一规律

Vim 的快捷键再好记,也是有规律的。最常见的一种结构是“操作符 + 动作”。操作符是修改文字的命令,比如:

  • d删除(delete)
  • y复制(yank)
  • c修改(change,相当于删除后进入插入模式)
  • >向右缩进

动作是光标要跨越的范围,比如w代表一个单词、j代表向下一行、$代表行尾。两者组合一下:

  • dw删除到下一个单词的开头
  • dd删除整行
  • yy复制当前行
  • c$从光标位置删到行尾并进入插入模式

前面还可以加数字,表示重复次数。比如3dd删除三行,5yy复制五行。这就是所谓的“动词 + 宾语 + 数量词”的语言结构,本质上 Vim 把编辑文本变成了一种命令语言。一旦理解了这层逻辑,很多没见过的组合都能靠常识推出来,而不是死背快捷键。

2. 保存退出与文件操作:一天用一百遍的基础功

Vim 初学者踩的第一个坑几乎都是退出。用久了以后你会发现,:这个键后面藏着的是整个文件操作的入口。我只挑真正常用且容易混淆的命令说。

2.1 保存退出的全部姿势

我把平时用的保存退出命令整理成一张速查表,贴在最顺手的位置:

命令作用备注
:w保存只保存不退出
:q退出有未保存修改时会提示
:q!强制退出不保存修改全部丢弃
:wq保存并退出最常用
:x保存并退出只在有修改时才写入文件
ZZ保存并退出普通模式下直接按
ZQ不保存退出相当于:q!

这里面最容易被忽略的是ZZ。很多人在普通模式下习惯性地输入wq,结果屏幕上莫名其妙多了两个字母。正确姿势是在普通模式下直接按大写Z两次,文件保存并退出,不用加冒号。说实话我刚用 Vim 的头一年全靠ZZ收尾,因为它省去了冒号按键。

另一个高频场景是sudo vim和普通用户打开文件之后的权限问题。如果你用普通用户打开了一个需要 root 权限的文件,改完了发现:w报错“read-only”,别急着:q!扔掉所有修改,可以在命令行模式下执行:

:w !sudo tee %

这行的意思是把当前缓冲区内容通过标准输出传给sudo tee命令写回原文件。有点黑科技的味道,但在服务器上应急非常管用,我自己靠这招救回过好几次忘了加sudo导致的编辑现场。

2.2 多文件打开、切换与路径跳转

服务器上改配置时经常要同时看多个文件,Vim 支持一次打开多个:

vim file1.txt file2.txt

进入 Vim 后,用:ln或者:bn切换到第一个或下一个文件,:bp退回上一个。也可以用:e 文件名继续打开新文件。想不起当前有哪些文件在缓冲区里,就输入:ls查看列表,按缓冲区编号跳转。

还有一个热搜词经常被问到:“vim 打开文件里引用的文件路径”。这个场景在改代码时特别常见,光标停在一个#include、require或者import路径上,想直接跳进去看看。Vim 内置了gf命令,普通模式下把光标放在路径字符串上按gf,Vim 会尝试用当前目录作为基准打开这个文件。如果文件不在预期路径下,可以设置path选项再试:

:set path+=/usr/include/** " 追加搜索路径,具体按实际项目配置

回到上一个文件的快捷键是Ctrl+^(按住 Ctrl 再按 6 上方的 ^)。这个我每天按几十次,在头文件和源码之间来回切换时比鼠标点边栏快得多。另一个相关技巧是Ctrl+o和Ctrl+i,它们是在跳转记录里前进和后退,在处理复杂跳转时非常实用。

3. 光标移动与全文跳转:躲开方向键的人生

Vim 对方向键的设计充满恶意,起码我是这样过来的。普通模式下h j k l分别对应左、下、上、右,刚开始手特别不习惯,总觉得用方向键更快。但一旦方向键依赖被戒掉,你就获得了“指不离键”的能力,尤其在远程服务器上改文件时,这种能力就是效率的基石。

3.1 字符级与单词级移动

最基础的四个键:

  • h左移一个字符
  • l右移一个字符
  • j向下移动一行
  • k向上移动一行

单词级移动是真正的效率分水岭:

  • w跳到下一个单词词首
  • e跳到当前或下一个单词词尾
  • b回到上一个单词词首
  • ge回到上一个单词词尾

比较有讲究的是中国程序员用 Vim 时经常遇到“中英文混合文本”,默认w按空格和标点分隔单词,对中文文本的感知比较弱。这时候可以配置iskeyword,让中文按字符移动,但改了之后也可能带来其他行为变化。我自己的习惯是:代码、英文文档用默认设置,写纯中文博客时采用按字符跳转的映射,其实就是把w映射为l的重复逻辑,专门适配中文场景。

行内移动方面:

  • 0跳到行首(第 0 列)
  • ^跳到行首第一个非空字符
  • $跳到行尾
  • f后跟一个字符,跳到本行下一个该字符处,比如fx跳到下一个 x 的位置;F反向查找;;重复上一次查找,,反向重复

3.2 屏幕与全文跳转

很多人在搜索栏里问“Vim 怎么到底端”,答案就是普通模式下按大写G,光标会直接跳到文件最后一行。对应地,gg跳到第一行,50G跳到第 50 行。日常整理日志、快速翻看长文件时这两个键足够用了。

整屏翻页用:

  • Ctrl+f向下翻一页
  • Ctrl+b向上翻一页
  • Ctrl+d向下翻半页
  • Ctrl+u向上翻半页

另外H、M、L可以快速把光标定位到当前屏幕的顶部、中部、底部,对应英文 home、middle、last 三个位置,这是在长代码文件里保持上下文的利器。

括号匹配是写代码时的刚需。把光标放在(、{、[上,按%可以直接跳到与之匹配的另一半。我查括号不配对的问题时,几乎全靠%来回扫,比肉眼数括号高效得多。还有一个高频命令是.(英文句号),它的作用是重复上一次修改操作,但它更适合放在编辑部分详细讲,因为它是批量修改的灵魂。

4. 编辑、复制、粘贴与撤销:把手从鼠标上拿开

编辑操作是 Vim 里最令人想拍桌子的部分,也是熟练之后最爽的部分。核心内容就是删除、复制、粘贴、替换和撤销。

4.1 删除、复制、粘贴的内部逻辑

删除命令以d开头:

  • x删除光标处一个字符,等于在普通的 Backspace 前面删
  • dd删除整行
  • dw删除到下一个单词词首
  • d$或D删除到行尾
  • d0删除到行首
  • diw删除光标所在单词,不考虑光标在单词哪个位置

复制命令对应y:

  • yy复制当前行
  • yw复制一个单词
  • y$复制从光标到行尾
  • yiw复制当前单词

粘贴用p在光标后粘贴,P在光标前粘贴。如果复制的是一整行,p会在当前行下方新起一行粘贴;如果是单词或字符,则排在光标后面。这个行为差异经常让新手困惑,理解了“行的复制会以行为单位粘”就清楚了。

修改命令c是“删除后进入插入模式”的合成命令,cw相当于dw后再进入插入模式,cc清空整行并插入,c$清空到行尾并插入。写代码改函数名、改变量名时,cw特别顺手。

交换内容时还有一个隐藏知识点:Vim 删除的内容不是直接丢弃,而是存进寄存器。所以dd并不会真的“删没”,你可以直接p把它粘到别处。这跟系统剪贴板是两套体系,日常使用足够,但如果你发现剪贴板内容丢失,大概率是 Vim 的寄存器机制和系统剪贴板没有打通。后面配置部分我会讲怎么打通。

撤销与重做也在这一块:

  • u撤销
  • Ctrl+r重做
  • .重复上一次修改

.命令是我个人最依赖的快捷键。比如你要把文件里的多个“foo”改成“bar”,先手动完成第一次替换,再把光标移到下一个“foo”上,按.重复,它就是一次完整的替换。配合查找命令,速度可以非常离谱。

4.2 查找、替换与全局操作

查找字符串的基本方式是普通模式下按/,输入关键词,回车后按n跳到下一个匹配,按N回到上一个。光标停在某个单词上时,直接按*可以向下查找该词,#向上查找。这个技巧在阅读别人代码时极其好用。

替换的完整语法是:

:s/old/new/ " 替换当前行第一个匹配 :s/old/new/g " 替换当前行全部匹配 :%s/old/new/g " 替换全文所有匹配 :%s/old/new/gc " 替换全文,逐个确认 :10,20s/old/new/g " 替换第10到20行之间的所有匹配

其中%代表整个文件,c标志表示每次替换前询问,输入 y、n、q 分别表示确认、跳过、退出。批量替换时我强烈建议加c,特别是涉及正则表达式时,很容易误伤不想改的内容。真实项目里我曾用一行:

:%s/OrderId/OrderID/gc

把某次数据库字段更名的影响范围控制得很干净,既不用手动改几十个文件,又能在每处替换前确认要不要动。

Vim 替换支持正则表达式,比如:%s/^/ /g可以在每一行行首插入两个空格。批量注释代码可以用:10,20s/^/#/在指定范围的行首加井号。^在正则里代表行首,这跟移动到行首的^是同一个字符但作用在不同上下文,新手容易懵,其实 Vim 的规则是:命令行模式下输入^,配合替换语法时它作为正则锚点出现。

批量行操作还有一个快速方法:选中多行后按>或<,每行向右或向左缩进一个 tab。这在整理缩进混乱的配置文件时比手动Shift+Tab高效太多。

5. 可视模式、宏录制与分屏:从单点操作走向批量处理

Vim 真正拉开与普通编辑器差距的地方,是批量处理能力。可视模式让你能看清楚选区再操作,宏录制则帮你把重复动作自动化。

5.1 可视模式的三件套

可视模式分为三种:

  • v字符可视模式,可以逐字符选择
  • V行可视模式,按行选择
  • Ctrl+v块可视模式,以矩形块选择

块可视模式是最有威力的工具。比如多行行首都要插入内容,你可以把光标移到第一行行首,按Ctrl+v,然后按j向下扩展到多行,再按大写的I输入内容,最后按Esc,所有选中行行首都会插入同样内容。这个操作我在给 CSS 属性加前缀、给 Markdown 列表统一加符号时用了无数次。

反过来,块模式也能批量删除一列。比如每行末尾都有一个多余的空格或逗号,选中后按x一次删干净。有些文本文件是空格对齐的表格,用块选择框住某一列以后,可以整体复制、拖动,甚至交换两列位置,这比在 Excel 里操作还方便。

如果选完以后想重新调整选区,gv可以重新选中上次的可视区域,不用从头再来。这在实际反复测试替换范围时特别有用。

5.2 宏录制与寄存器

宏录制的基本流程是:

  1. 普通模式下按q,再按一个字母,比如qa,开始录制到寄存器 a。
  2. 做一系列操作。
  3. 再次按q停止录制。
  4. 按@a回放这个宏;@@重复最近一次宏调用。

我给你举一个真实的例子。有一次我需要把一个文本文件里的第 2 列和第 3 列互换,格式是空格分隔的多行。手工做可能要重复一百次,但录一个宏就解决:

qa 开始录制到寄存器 a 0f 空格 跳到行首,然后 f 空格 找到第一个空格 dW 删除到下一个单词词首 w 移动到下一个单词 p 粘贴 q 停止录制 @a 回放一次

回放后检查效果没问题,就可以用99@a或者配合:1,100normal @a对前 100 行批量执行同一宏。normal命令是 Vim 里批量执行普通模式命令的好帮手,非常推荐掌握。

寄存器方面,最常见的需求是把 Vim 复制的内容粘贴到系统其他程序里。默认情况下,Vim 的复制内容不进入系统剪贴板,但装了图形界面的 Vim 或终端支持剪贴板时,你可以用"+y复制到系统剪贴板,用"+p从系统剪贴板粘贴。没有这个需求时不用管,但如果你的 Vim 版本显示-clipboard,说明编译时没带剪贴板支持,得安装图形版 Vim 或者vim-gtk3。

5.3 分屏与窗口管理

分屏操作比想象中简单:

  • :sp水平分屏,另一个窗口显示同一个文件
  • :vsp垂直分屏
  • Ctrl+w后按w在窗口间切换
  • Ctrl+w后按h j k l按方向切换窗口
  • Ctrl+w后按=让所有窗口大小均等
  • Ctrl+w后按_最大化当前窗口高度
  • Ctrl+w后按|最大化当前窗口宽度
  • Ctrl+w后按c关闭当前窗口

分屏的真正价值在于对比两个相关文件,比如一边看 HTML 一边看 CSS,或者一边看接口文档一边写代码。比起来回打开多个终端,窗口管理规则一旦形成肌肉记忆,切换成本趋近于零。

6. 个人配置与自定义快捷键的定制思路

Vim 默认设置谈不上新手友好,但几乎所有槽点都能通过.vimrc消除。配置文件位置一般在~/.vimrc,装好后第一件事就是自己写一个,保存为普通文件即可。

6.1 新手提供安全感的推荐配置

以下是我个人常年用得最顺的几行基础配置:

set number set relativenumber set tabstop=4 set shiftwidth=4 set expandtab set autoindent set nowrap set incsearch set hlsearch set ignorecase smartcase " 搜索时忽略大小写,但输入大写时精准匹配 syntax on set encoding=utf-8 set fileencodings=utf-8,gbk,big5 " 处理中文编码 set backupdir=~/.vim/backup set swapfile set timeoutlen=500

set number显示绝对行号,set relativenumber显示相对行号,两者组合后 Vim 会在当前行显示绝对行号,其他行显示相对行号,这非常有利于配合d5j这类“向下删 5 行”的操作,因为你能直接看到距离。

中文服务器环境里的乱码问题,靠encoding和fileencodings配置能解决大部分。一次改配置文件时遇到 GBK 编码,默认情况下中文全乱,手动指定:e ++enc=gbk或者用fileencodings让它自动识别,之后就能正常显示和保存。

set timeoutlen解决的是“按 Esc 延迟”问题。默认情况下 Vim 等待特殊键的时间太长,导致从插入模式退出时有肉眼可见的延迟。调低到 500 到 1000 毫秒,会顺滑很多。

6.2 映射命令与 Leader Key

自定义快捷键的基础是映射命令。最常见的几个:

  • map同时生效于普通模式和可视模式
  • nmap仅普通模式
  • imap仅插入模式
  • noremap表示不做递归映射,建议尽量用它

设置 Leader 键是 Vim 社区最流行的模式。默认 Leader 是\,很多人改成,或空格:

let mapleader="," nnoremap <Leader>w :w<CR> nnoremap <Leader>q :q<CR> nnoremap <Leader>f :Files<CR>

设定后,按,后紧接着按w就等于执行:w,不用再去按冒号。<CR>是回车键的表示。注意nnoremap这里用的是不递归映射,避免后续命令触发其他映射造成连锁反应。

IDE 类场景里,IDEA、VS Code、PyCharm 等都有 Vim 插件。它们把 Vim 快捷键嵌套在原有 IDE 快捷键体系中,核心规律一致,但要注意插件默认可能有自己的 Leader 键设置,不要跟 IDE 本身的快捷键冲突。热搜词里有一堆“idea 快捷键、vscode 常用快捷键、ps 快捷键大全”之类的问题,其实任何编辑器装上 Vim 插件后,处理文字本身的快捷键都是一套底层逻辑,不同的是“文件树打开”“运行代码”这类 IDE 专属功能要跑 IDE 自己的快捷键。

插件安装方面,我推荐新手门槛最低的 vim-plug。先安装插件管理器,再在.vimrc里写:

call plug#begin('~/.vim/plugged') Plug 'preservim/nerdtree' Plug 'junegunn/fzf.vim' Plug 'neoclide/coc.nvim', {'branch': 'release'} call plug#end()

保存后执行:PlugInstall就能安装。配置关键字映射时注意一个坑:插件自带的映射可能会覆盖你的自定义,如果发现某个快捷键失灵,用:map查看现状,用:verbose map <按键>查看它被谁定义的。热搜词里“如何查看快捷键被什么程序占用了”问的很大程度就是这个问题,不过在 Vim 内部排查起来要简单得多。

7. 快捷键冲突排查与 Vim 日常急救实测

最后这部分是全是踩过的坑。很多问题不是 Vim 本身出错,而是使用环境的问题。

7.1 Vim 内部的快捷键占用排查

想知道某个按键在 Vim 里被谁占用,在命令行模式里输入:

:map

不带任何参数时列出现有所有映射,数量多时可以加上 grep 过滤:

:map <Leader> :verbose map <Leader>w

verbose会显示这个映射定义在哪个文件哪一行,排查插件冲突非常有用。如果你想查终端层面的按键占用(比如某个终端把Ctrl+s割占了),就需要脱离 Vim 去看终端设置。一个靠谱的排查方法是先确认这个按键在 Vim 里是否被映射,再确认是否被终端模拟器拦截,最后确认是否被系统全局快捷键接管。无忧无虑的做法是换个终端环境测一下,比如从 gnome-terminal 切到 tmux 里测,就能缩小范围。

桌面环境下的全局快捷键用系统工具查,比如 Linux 上可以用xev查看按键事件,Windows 上可以用第三方工具查看注册表里的快捷键占用。这类问题一般跟 Vim 没有直接关系,而是系统层面抢键。

7.2 挂起、冻结与缓存文件的急救速查

最常见的是Ctrl+s把终端冻结了。这个错误基本是肌肉记忆害的:在普通编辑器里Ctrl+s是保存,在终端里按下去却会向终端发送 XOFF 控制字符,Vim 画面不滚动,看起来像卡死了。解决方法是按Ctrl+q解冻。这个坑我至少教过两次新人,几乎每个第一次在终端里用 Vim 的人都会中招。问题是很多桌面环境的终端还支持自定义映射,建议把Ctrl+s的终端映射改掉或者禁用,避免心态爆炸。

Ctrl+z会把 Vim 挂起到后台,回到 shell,这时候输入fg可以恢复。注意不是数据丢失,Vim 进程还在后台。

.swp文件是 Vim 的交换文件。紧急断电或 Vim 崩溃后会残留,再次打开时会提示“Swap file already exists”,这时可以选r恢复上次未保存的内容。恢复后保存并退出,记得手动删除那个.swp文件,否则每次打开都会提示。要关闭这个提示文件也可以,但我个人不建议关,它在关键时刻能救命。

插入模式下频繁按 Esc 然后误按方向键会进入奇怪的状态,比如光标移动变成反斜杠等乱字符,这多半是因为终端没有正确识别键盘序列。新版 Vim 对这类兼容问题已经处理得比较好了,但如果你用的是老版本或者特殊终端,建议升级 Vim 或者在.vimrc里加上set t_ku=^[OA之类的终端键修正。

关于快捷键,我个人在实际操作中的体会是:不用企图一次性记全,更不要背字典。把每天的常用操作固定下来,遇到“原来 Vim 这样也能做”的新技巧时,当场多按几遍,顺手记到自己的.vimrc注释里,一个季度下来基本就形成条件反射了。最后再分享一个小技巧:打开 Vim 后随时输入:help 某个命令可以查看内置文档,那里面的内容永远比我这种第三方总结更权威,碰到不确定的细节,第一反应养成查帮助的习惯,比收藏任何文章都实在。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询