ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vim编辑器常用命令实战:从模式切换到高效编辑

Vim编辑器常用命令实战:从模式切换到高效编辑 很多朋友第一次在服务器上打开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进入行选择模式一次选整行按Ctrlv进入块选择模式可以选矩形区块批量操作的前置步骤。切换方式很简单Esc键或者Ctrl[从任何模式退回普通模式。我强烈建议你把Ctrl[这个组合练熟因为Esc键在键盘左上角手要伸很远才能按到而Ctrl[在很多人的肌肉记忆里更顺手速度也更快。2.2 为什么Vim要把“移动”和“编辑”分开这块是理解Vim精髓的关键。普通模式下你会用到一组移动命令h/j/k/l左 / 下 / 上 / 右替代方向键。这样手指不离开键盘主区域就能移动光标。0跳转到行首^跳到行首的第一个非空白字符$跳到行尾。gg跳转到文件第一行G跳转到文件最后一行nG跳转到第n行。w跳到下一个单词的词首b往回跳一个单词词首e跳到当前单词词尾。Ctrld向下翻半页Ctrlu向上翻半页Ctrlf向下翻一页Ctrlb向上翻一页。这套键位设计是有规律的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撤销上一次操作多按几次可以连续撤销。Ctrlr重做也就是撤销的反操作。这里有个很实用的细节在普通模式下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比普通命令行编辑工具强的地方在于可视模式。假设你想批量给一段文字加上缩进或者复制好几行用可视模式最直观在普通模式下按V进入行选择模式选择多行或者按v进入字符选择模式。用j/k或者h/l扩展选中范围。选中后按d删除、y复制、增加缩进、减少缩进。这个模式非常适合处理配置文件、代码块。有时候你复制了一段配置需要整体向后缩进两格用可视模式选中后按两次就搞定了。不需要每一行都去手动加空格也不用担心对齐错乱。5. 配置Vim和插件起步从“能用”到“好用”5.1 vimrcVim的“记忆卡”Vim所有的设置都存在一个叫vimrc的文件里全局配置在/etc/vim/vimrc或/etc/vimrc用户级配置在~/.vimrc。强烈建议你新建一个~/.vimrc因为全局配置是系统范围的你不一定有权限改而且改了会影响所有用户。一个基础可用的vimrc长这样 显示行号 set number 语法高亮 syntax on 自动缩进 set autoindent 设置缩进宽度 set tabstop4 set shiftwidth4 把tab键显示为4个空格注意这不会改变文件本身的字符只是显示 set expandtab 搜索时高亮 set hlsearch 搜索时实时匹配 set incsearch 开启鼠标支持方便在图形终端下选择 set mousea 底部显示当前命令 set showcmd 显示模式 set showmode 设置编码 set encodingutf-8这些配置项每个实验室我都会让你测试一下比如set number加不加区别一目了然。set tabstop4在代码缩进时特别重要默认值可能是8格看着非常占地方。一个常见的坑set expandtab会把tab键实际输入成空格这在有些场景下是好事有些场景下是坏事。如果你在写Makefiletab键必须是真实的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 按CtrlS卡住怎么解这个坑几百年前就有但直到今天依然有新人踩。在终端里按CtrlS后会“冻结”屏幕看起来像Vim死掉了键盘输入什么都没反应。实际上这是终端复用协议的功能CtrlS是停止输出CtrlQ恢复输出。碰到这个情况不要慌按一下CtrlQ世界就恢复了。我第一次遇到的时候直接强制关闭了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-remote或ibus相关的快捷键在按Esc前先把输入法切回英文。不同发行版配置不同但核心思路是在用Vim的快捷键时尽量保持英文输入状态。我的个人习惯是在Vim里编辑中文的场景其实不多大部分是改配置、写代码如果在写注释时需要中文每次写完立刻切回英文长此以往就形成了肌肉记忆。7. 实操记录一次完整的Vim排查日志为了让你更直观地理解上面这些命令怎么串起来我模拟一个真实的操作场景假设你要修改nginx的默认站点配置把监听端口从80改成8080并注释掉server_name那一行。打开文件vim /etc/nginx/sites-available/default搜索listen/listen按n跳转到需要修改的那行。你会看到类似listen 80 default_server;。把80改成8080光标停在80附近时按r替换单个字符再按数字8。然后按i在80后面加一个0按Esc退出插入模式。如果只是想简单改成8080也可以直接把光标移到数字最后一位按a追加一个0。注释server_name搜索server_name按n找到目标行然后在普通模式下按I行首插入输入#按Esc。这行就被注释掉了。检查改动按gg回到第一行然后按Ctrlf下一屏、Ctrlb上一屏快速浏览一遍。你还可以先:set hlsearch高亮方便看清哪些行被修改过。保存退出:wq保存并退出。验证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里你的手指应该永远处于“可移动”状态不要离开主键盘区太久。一旦习惯了这套操作逻辑你编辑文本时会自然形成“动词方向”的思维方式而不是“鼠标点来点去”的零散操作。这种效率提升虽然不直观但日积月累非常可观。
返回列表