Vim编辑器常用命令实战:从模式切换到高效编辑
2026/9/17 18:02:56 网站建设 项目流程

很多朋友第一次在服务器上打开Vim,光标停在屏幕中间,键盘按了半天没反应,然后彻底懵了。这不怪你,Vim是我见过学习曲线最陡峭的编辑器之一,但它也是Linux运维、开发场景下几乎躲不掉的存在。无论你是要改个nginx配置、写个cron任务,还是编辑一段脚本,只要SSH连上服务器,就大概率要和它打个照面。

这篇文章我会把Vim编辑器常用命令按照实际使用逻辑重新梳理一遍,不按手册顺序背命令,而是按照“你进到一个文件里会做哪些事”来拆解。除了命令本身,还会解释它背后的设计逻辑、常见误区以及我这些年踩过的一些坑,希望你能少走几个弯路。

1. 为什么Vim这么多反人类的键位,却依然没被淘汰?

Vim的设计理念和普通编辑器完全不是一路的。我们常用的记事本、VS Code、Sublime这些都是“无模式编辑器”,你打开就能打字,键盘上输入什么字符,屏幕上就出现什么字符。而Vim是“模式编辑器”,它区分了“查看模式”和“编辑模式”,这个设计从1976年的Vi时代就定了下来,一直延续到今天。

刚开始接触Vim的人最容易崩溃的点就在这里:打开文件后默认处于普通模式(Normal Mode),这时候你敲键盘上的字母,并不会输入到文件里,而是当作命令执行。比如你敲一个d,它不会打出字母d,而是进入“删除操作”的待命状态。等你明白了这套逻辑,你才能真正开始“用”Vim,而不是“被困”在Vim里。

这套设计最核心的收益是效率。你的手不需要离开键盘主区域去够鼠标或方向键,所有的移动、编辑、保存操作都可以在键盘主区域内完成。熟练之后,你编辑文本的速度会比用鼠标快得多。这也是为什么几十年来它依然是Linux世界默认安装的编辑器,因为服务器环境里没有图形界面,而Vim最节省系统资源,性能极其稳定,任何发行版都内置它,出了问题你至少能有个编辑器可用。

如果你刚接触Linux,我建议你别试图“学习所有Vim命令”,只需要先掌握不超过20个最常用的,形成肌肉记忆,后面再逐步扩充。这篇文章就是按这个思路来写的。

2. 核心概念和模式切换:先搞定你脑子里那团乱麻

2.1 三种模式到底是怎么回事

Vim有几种模式,但普通人真正需要先记住的就三个:普通模式、插入模式、可视模式(还有命令行模式,但我们把它合并到操作里讲)。

  • 普通模式(Normal Mode):打开Vim后的默认状态。这个模式下你敲的所有按键都被解释成命令,不是输入文字。比如x表示删除光标所在字符,dd删除整行。很多人第一次用Vim觉得“卡住了”,其实就是在什么都不懂的情况下进入了普通模式,输入字母却没有任何文字出现。
  • 插入模式(Insert Mode):这个模式才真正用来往文件里写内容。在普通模式下按i(光标前插入)、a(光标后追加)、o(下方新建一行)都可以进入插入模式。进入后屏幕左下角会显示-- INSERT --,这时候打字就和平常编辑器一样了。
  • 可视模式(Visual Mode):用来选中文本的。普通模式下按v进入字符选择模式,移动光标即可选中一段文字;按V进入行选择模式,一次选整行;按Ctrl+v进入块选择模式,可以选矩形区块,批量操作的前置步骤。

切换方式很简单:Esc键或者Ctrl+[从任何模式退回普通模式。我强烈建议你把Ctrl+[这个组合练熟,因为Esc键在键盘左上角,手要伸很远才能按到,而Ctrl+[在很多人的肌肉记忆里更顺手,速度也更快。

2.2 为什么Vim要把“移动”和“编辑”分开?

这块是理解Vim精髓的关键。普通模式下你会用到一组移动命令:

  • h/j/k/l:左 / 下 / 上 / 右,替代方向键。这样手指不离开键盘主区域就能移动光标。
  • 0:跳转到行首;^:跳到行首的第一个非空白字符;$:跳到行尾。
  • gg:跳转到文件第一行;G:跳转到文件最后一行;nG:跳转到第n行。
  • w:跳到下一个单词的词首;b:往回跳一个单词词首;e:跳到当前单词词尾。
  • Ctrl+d:向下翻半页;Ctrl+u:向上翻半页;Ctrl+f:向下翻一页;Ctrl+b:向上翻一页。

这套键位设计是有规律的:h、j、k、l在键盘上是连在一起的,用这四个键代替方向键,双手不动就能覆盖整块键盘。这个布局的原型甚至在打字机时代就已经有了雏形,后来被Vi继承并固化。

可能你会问:“那我直接用方向键不就行了吗?”行,但不划算。方向键区域太远了,你的右手要频繁在字母区和方向区之间来回移动,一次两次无所谓,一天编辑几百行代码的时候,效率差距就很明显了。而且有些最小化的Linux环境里方向键可能不太好用,但hjkl永远可用。

2.3 普通模式下的移动能力其实也是“编辑能力”

很多人以为Vim的移动命令就是让光标跑来跑去,其实不是。Vim有一个非常强大的设计哲学:移动命令可以和编辑命令组合使用。比如d表示删除,w表示移动到下一个词首,组合起来dw就是“删除到下一个词的开头”;d$就是“从光标删除到行尾”;d0就是“从光标删除到行首”。同理,y(复制)也可以和移动命令组合:yw复制一个单词,y$复制到行尾。

这就是Vim命令的“语法”逻辑:操作符 + 动作命令 = 一个完整的编辑操作。掌握了这个逻辑,你不需要死记硬背大量的组合命令,只需要知道操作符有哪些、动作有哪些,然后自己排列组合就能得到你想要的编辑效果。这比背几十条快捷键要高效太多。

3. 最常用的编辑命令:改、删、复制、粘贴

3.1 插入类命令:进入插入模式的不同姿势

很多人只知道按i进入插入模式,但其实根据你要插入文本的位置不同,选择不同的命令能少按几下键:

  • i:在当前光标前插入。
  • a:在当前光标后插入,相当于先移到光标右边再进入插入模式。
  • I:跳到当前行行首并进入插入模式。
  • A:跳到当前行行尾并进入插入模式,这个非常常用,想在一行末尾追加内容时直接A加内容,比光标移过去再操作快得多。
  • o:在当前行下方新开一行并进入插入模式。
  • O:在当前行上方新开一行并进入插入模式。

举一个实际场景:你打开配置文件,发现某一行末尾需要加个参数,按A,光标直接跳到最后,输完内容,按Esc,继续看下一处。整个流程手不离开键盘,非常流畅。

3.2 删除、复制、粘贴、撤销:Vim的灵魂操作

这部分就稍微细一点了:

  • x:删除光标所在字符,按住可以连续删。类似退格键的删除方向。
  • dd:删除光标所在的整行。
  • d + 移动命令:配合移动命令做范围删除,前面已经说过了。
  • yy:复制光标所在的整行。
  • p:在光标位置之后粘贴;P:在光标位置之前粘贴。注意Vim的p是“粘贴到光标右侧/下一行”,和Windows下的粘贴行为略有不同,刚开始容易搞混。
  • u:撤销上一次操作,多按几次可以连续撤销。
  • Ctrl+r:重做,也就是撤销的反操作。

这里有个很实用的细节:在普通模式下,dd删掉的内容会被放进去粘贴缓冲区,粘贴命令p会把它取出来。所以如果你想“移动一行文本”,只需要dd然后移动光标到目标位置,再按p就完成了。同样的,yy复制一行后,按p也能实现“复制行到别处”的效果。这个逻辑比鼠标操作要快得多。

粘贴还有一个细节:如果你想粘贴多行,Vim会把整个缓冲区内容都粘进去,不需要提前选中。

3.3 保存和退出:最常见的卡壳点

如果你搜索“vim 保存 退出”,会发现这个问题的搜索量常年居高不下。原因很简单:进入插入模式还能靠懵,但保存退出时如果没有明确的知识点,完全靠猜是弄不出来的。

普通模式下输入冒号:进入命令行模式,然后:

  • :w:保存文件,但还没有退出。
  • :q:退出Vim,如果有未保存的改动会报错。
  • :wq:保存并退出,这是最常用的组合命令。
  • :x:保存并退出,和wq基本等价,但如果文件没改动过,:x不会额外单独写入文件(它不更新修改时间)。
  • :q!:放弃所有未保存的修改并强制退出。如果你改坏了不想保存,用这个。
  • :wq!:强制保存并退出,一般用于只读文件,如果文件本身没有写权限(比如只有root能写),你还是得用sudo重新打开再修改。

为什么会有这么多退出方式?因为Vim在设计上非常注重“防止误操作”。它默认不允许你改了内容就直接退出丢掉修改,所以q会报错,必须显式地用q!表示“我确实要丢弃修改”。这个设计看起来很繁琐,但它确实能避免很多手滑导致的数据丢失。

最掉坑的一条经验:如果你打开了一个文件但没改过,直接输入:q就能退出。但如果你改了内容又后悔了,输入:q会提示“No write since last change”,这时候你需要按E确认丢弃还是按N取消。有些新手看到这个提示就懵了,其实就是在问你要不要保存。

4. 查找替换与进阶操作:让Vim替你干活

4.1 文件内查找:斜杠一敲,立刻跳转

在配置文件里找一个关键字,不需要鼠标滚轮滚动,直接按/,底部会提示输入搜索词,回车后光标会跳到第一个匹配位置。

  • n:跳转到下一个匹配。
  • N:跳转到上一个匹配。
  • ?:向前搜索(也就是说,和/的搜索方向相反)。
  • *:把光标所在位置的单词作为搜索词,快速查找下一个匹配,非常实用。
  • #:和*方向相反。

有个经验分享:如果你只想确认某个字符串在文件里出现了几次,可以用:set hlsearch打开高亮显示(默认在多数Linux发行版的Vim里高亮可能没打开),找到一次就能看到所有的匹配。如果高亮太刺眼,:nohlsearch取消当前高亮。这个功能在编辑日志、配置文件时尤其有用,一眼扫过去就知道哪里有相关内容。

4.2 替换命令:批量修改不用脚本

搜索之外更常用的是替换。在命令行模式下用:s进行替换:

  • :s/old/new:替换当前行第一个匹配的old为new。
  • :s/old/new/g:替换当前行所有匹配的old为new。
  • :%s/old/new/g:替换全文件所有匹配的old为new。
  • :%s/old/new/gc:逐个替换,每次都会问你确认,适合不确定是否全替换的场景。

这三条命令的适用场景差异巨大。如果你只想改文件某一行的内容,就用前两条;如果你想统一改全文里的某个变量名、IP地址等,就用第三条。如果需要逐个确认,加个c就好。

有个经常被忽略的小细节:替换命令里的old部分支持正则表达式。比如:%s/^/#/g会在每一行行首加上#,一键注释掉整段配置;:%s/$/;/g会在每行行尾加上分号。这两条命令我改配置时经常用,注释、去掉注释都非常高效。

4.3 多文件操作:同时改多个配置

我们实际操作时经常要改好几个文件,比如同时调整nginx的多个站点配置。Vim支持多文件:

  • vim file1 file2:同时打开多个文件。
  • :n:切换到下一个文件。
  • :N:切换到上一个文件。
  • :files:查看当前打开了哪些文件。
  • :e 文件名:在当前窗口打开另一个文件,不用重启Vim。

这几个命令说实话我用的不算多,因为大部分场景下开多个终端窗口用远程工具管理多个文件更方便。但偶尔在只有一个SSH会话的情况下,:e切换文件确实能救急。

4.4 可视模式与批量操作:一次搞定整段处理

我觉得Vim比普通命令行编辑工具强的地方在于可视模式。假设你想批量给一段文字加上缩进,或者复制好几行,用可视模式最直观:

  1. 在普通模式下按V进入行选择模式(选择多行),或者按v进入字符选择模式。
  2. j/k或者h/l扩展选中范围。
  3. 选中后按d删除、y复制、>增加缩进、<减少缩进。

这个模式非常适合处理配置文件、代码块。有时候你复制了一段配置,需要整体向后缩进两格,用可视模式选中后按两次>就搞定了。不需要每一行都去手动加空格,也不用担心对齐错乱。

5. 配置Vim和插件起步:从“能用”到“好用”

5.1 vimrc:Vim的“记忆卡”

Vim所有的设置都存在一个叫vimrc的文件里,全局配置在/etc/vim/vimrc/etc/vimrc,用户级配置在~/.vimrc。强烈建议你新建一个~/.vimrc,因为全局配置是系统范围的,你不一定有权限改,而且改了会影响所有用户。

一个基础可用的vimrc长这样:

" 显示行号 set number " 语法高亮 syntax on " 自动缩进 set autoindent " 设置缩进宽度 set tabstop=4 set shiftwidth=4 " 把tab键显示为4个空格(注意,这不会改变文件本身的字符,只是显示) set expandtab " 搜索时高亮 set hlsearch " 搜索时实时匹配 set incsearch " 开启鼠标支持,方便在图形终端下选择 set mouse=a " 底部显示当前命令 set showcmd " 显示模式 set showmode " 设置编码 set encoding=utf-8

这些配置项每个实验室我都会让你测试一下,比如set number加不加区别一目了然。set tabstop=4在代码缩进时特别重要,默认值可能是8格,看着非常占地方。

一个常见的坑:set expandtab会把tab键实际输入成空格,这在有些场景下是好事,有些场景下是坏事。如果你在写Makefile,tab键必须是真实的tab字符,否则make命令会报错“missing separator”。所以在编辑Makefile时最好用:set noexpandtab临时关闭这个设置。

5.2 插件管理:要不要装?

Vim的生态非常庞大,但服务器环境下我建议你谨慎使用插件。原因很现实:很多生产环境不允许你随便装插件,而且服务器上编辑文件的需求本身就不复杂,Vim自带的语法高亮、缩进、查找替换已经覆盖了80%的场景。

如果你确实想折腾,目前最流行的是vim-plug插件管理器,安装方式也很简单:

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim.vim/master/plug.vim

然后在vimrc里添加:

call plug#begin('~/.vim/plugged') Plug 'preservim/nerdtree' " 文件树 Plug 'vim-airline/vim-airline' " 状态栏美化 call plug#end()

装完重启Vim,执行:PlugInstall就能自动安装。我自己的经验是:除非你天天在终端里写代码,否则这些插件带来的收益有限,反而会增加Vim启动时间和出错概率。我的个人习惯是在服务器上保持Vim的原生状态,只做少量配置,把更多精力放在需要看大量代码的场景时配合终端与tmux使用。

5.3 编译器和编辑器的区别(冷知识但值得了解)

话题稍微发散一下,很多新手会把“编辑器”和“编译器”混为一谈。编辑器是你写字用的软件,比如Vim、VS Code、Sublime;编译是把高级语言代码翻译成机器可执行代码的工具,比如gcc、g++、javac。Vim只管改文本内容,它不知道你写的是Python还是C++。在Vim里写好代码点击保存,还需要另外执行编译命令(比如在终端里跑gcc hello.c -o hello)才能得到可执行文件。

这个区别在实际工作中很容易造成误解,尤其是一些刚接触Linux的朋友,以为Vim能“运行”代码。其实不能,Vim顶多提供一个:!python %这样的外部命令调用技巧——在命令行模式下输入!python %可以运行当前脚本文件,但这不是Vim自身的能力,只是借用了Shell的能力。做个区分非常重要,出了问题排查思路上才不会跑偏。

6. 常见问题与排查技巧:从卡死到救回数据

6.1 按Ctrl+S卡住,怎么解

这个坑几百年前就有,但直到今天依然有新人踩。在终端里按Ctrl+S后会“冻结”屏幕,看起来像Vim死掉了,键盘输入什么都没反应。实际上这是终端复用协议的功能,Ctrl+S是停止输出,Ctrl+Q恢复输出。碰到这个情况不要慌,按一下Ctrl+Q,世界就恢复了。

我第一次遇到的时候直接强制关闭了SSH窗口,结果文件编辑了半天全丢了。后来才明白,这个和Vim无关,却因为在Vim里操作而被怪到Vim头上。

6.2 按了Esc还是退不出来?

有时候在插入模式里怎么按Esc都退不回去,尤其是一些终端模拟器对Esc键的响应有延迟。实测Ctrl+[更可靠,上面已经提过。另外,如果终端设置了Meta键映射,Esc键可能被吞掉,需要检查一下终端配置。

还有一种“退不出去”的状况:你输入了冒号命令但没按回车,比如输了一半:w,光标在底部命令行区域,这时候按Esc可以退出命令行模式回到普通模式。很多新手在这里会以为Vim又卡住了,实际只是停留在命令行输入状态。

6.3 用sudo编辑没权限的文件

你打开一个只有root才能写文件,改完保存时报错“E45: 'readonly' option is set”。这时候如果你直接按:wq!强制保存,有时还是不行,因为当前进程对文件没有写权限。

推荐的做法是保存前先:w !sudo tee %,这个命令会调用外部命令te,以sudo权限把当前缓冲区内容写回原文件。这个技巧网上讨论得很多,但我不建议新手直接用,因为有权限风险。更稳妥的办法是:发现问题后不要纠结,退出后用sudo vim 文件路径重新打开再改。

6.4 Vim异常退出的恢复:swap文件

有时候SSH突然断开、服务器重启,Vim还没保存就关了。再打开文件时你会看到类似Swap file ".myfile.swp" already exists的提示。这不是文件损坏,而是Vim为防崩溃丢数据创建的交换文件。

处理方式:

  • O:以只读方式打开,把数据复制出来手动恢复。
  • E:直接忽略swp文件继续编辑(有覆盖风险,建议先把原swp文件备份出来)。
  • D:删除swp文件后打开(确认原文件状态没问题后再删,否则可能丢失恢复数据)。

我的经验是:如果这个swp文件存在,先别急着删,用它打开看看里面有没有你丢失的最新内容,有的话先复制走。确认没有需要恢复的数据后再删掉swp文件。另外,避免这个问题的好习惯是:养成随手保存的习惯,u能撤销但撤销不了断电丢失的进度。

6.5 中文输入法导致的“假死”

在Vim插入模式下输入中文,按Esc退出时中文输入法没有自动切换回英文,然后普通模式的命令键打出来都是中文,屏幕上什么反应都没有。这个不算Vim的锅,但在中文用户里特别常见。

解决办法是:设置终端或输入法在切换Vim普通模式时同步切换到英文输入法。比较省事的方法是,在终端里用fcitx5-remoteibus相关的快捷键在按Esc前先把输入法切回英文。不同发行版配置不同,但核心思路是在用Vim的快捷键时尽量保持英文输入状态。我的个人习惯是:在Vim里编辑中文的场景其实不多,大部分是改配置、写代码,如果在写注释时需要中文,每次写完立刻切回英文,长此以往就形成了肌肉记忆。

7. 实操记录:一次完整的Vim排查日志

为了让你更直观地理解上面这些命令怎么串起来,我模拟一个真实的操作场景:假设你要修改nginx的默认站点配置,把监听端口从80改成8080,并注释掉server_name那一行。

  1. 打开文件:
vim /etc/nginx/sites-available/default
  1. 搜索listen
/listen

n跳转到需要修改的那行。你会看到类似listen 80 default_server;

  1. 把80改成8080:

光标停在80附近时,按r(替换单个字符),再按数字8。然后按i在80后面加一个0,按Esc退出插入模式。如果只是想简单改成8080,也可以直接把光标移到数字最后一位,按a追加一个0。

  1. 注释server_name:

搜索server_name,按n找到目标行,然后在普通模式下按I(行首插入),输入#,按Esc。这行就被注释掉了。

  1. 检查改动:

gg回到第一行,然后按Ctrl+f(下一屏)、Ctrl+b(上一屏)快速浏览一遍。你还可以先:set hlsearch高亮,方便看清哪些行被修改过。

  1. 保存退出:
:wq

保存并退出。

  1. 验证:
nginx -t systemctl reload nginx

这套流程用到命令不多,但对新手来说已经足够应对日常的配置编辑了。

再补充一个稍微进阶的场景:你想把配置文件里所有旧的IP地址替换为新的IP地址。用:%s/192.168.1.100/192.168.1.200/g,一条命令搞定。如果IP出现的场景很多、怕误替换,加一个c后缀逐个确认::g/192.168.1.100/s//192.168.1.200/gc,每次替换前都会问你是否执行。

8. 给新手几条掏心窝的操作建议

从“能用Vim”到“用得顺手”,中间隔的不是命令数量,而是使用频率。我的建议是:先别背命令手册,每天固定用Vim改配置文件、写点脚本,慢慢你就会发现哪些键位是高频操作,然后再针对性地补充。

不要一上来就追求插件和美化。原生的Vim已经足够可靠,插件带来的配置复杂性很容易让人放弃。先把基本操作练熟了,再考虑彩色的状态栏和文件树,那时候你已经不需要那些东西了。

善用:help。Vim内置了极其详尽的帮助文档,遇到不认识的命令,:help 命令名就能查用法。即便文档是全英文的,配合在线翻译工具,看懂核心参数并不难。这一点比在网上搜零散的文章更有用,因为它一定是最准确、最新的解释。

不要把Vim当IDE用。Vim擅长的是快速修改文本,不是项目管理。处理大型工程项目时,用VS Code、JetBrains这类IDE配合Vim插件,往往体验更好。各得其所,没必要非得分个高下。

最后我再说一个让我受益很多的细节:在Vim里,你的手指应该永远处于“可移动”状态,不要离开主键盘区太久。一旦习惯了这套操作逻辑,你编辑文本时会自然形成“动词+方向”的思维方式,而不是“鼠标点来点去”的零散操作。这种效率提升,虽然不直观,但日积月累非常可观。

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

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

立即咨询