ARTICLE DETAIL

资讯详情

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

Vim编辑器最全常用命令梳理:从入门到高效使用(含退出、保存、替换实操)

Vim编辑器最全常用命令梳理:从入门到高效使用(含退出、保存、替换实操) 先讲一个我见过无数次的场景有人第一次登上一台云服务器用vim打开某个配置文件改了两行内容想保存结果发现光标停在屏幕中间怎么敲键盘都没反应。按Esc输入:wq回车没动静。又输入:q还是没动静。他终于忍不住问了那句经典的“怎么退出vim”——这个问题每年都有成千上万的新手在问。Vim这个四十多岁的编辑器给人的第一印象通常是“反人类”“难用”“学习曲线陡峭”。但你要是真正把它用顺了就会进入一个很微妙的阶段回到图形界面编辑器里改东西总觉得哪哪都别扭。我自己的感觉是Vim不是“难用”它只是和你从小到大的编辑习惯不一样。今天这篇不聊花的不堆砌那些一年都用不上一次的冷门技巧就把Vim编辑器里最常用、上桌率最高的命令系统梳理一遍讲清楚每个命令为什么这么设计、什么时候用、怎么组合起来效率最高。内容适合刚接触Linux的新手也适合那些用了很久但始终在“编辑、保存、退出”三层循环里打转的人。1. 先理解Vim的“反人类”设计模式到底是怎么回事1.1 编辑器不是编译器Vim只负责“改字”在进入命令细节之前我想先把一个基本概念掰扯清楚Vim是一个文本编辑器不是一个编译器更不是IDE。它做的事情是把字符按照你的意图增删改查至于编译、运行、调试那是gcc、python、gdb这些工具的事。所以你在Vim里写完代码按:w保存然后去终端执行编译命令或者配合其他工具完成构建。这跟“编译器和编辑器的区别”是两码事搞清楚这一点你对Vim的预期就不会错。Vim之所以能存在几十年还保持旺盛生命力核心不在于它有多少花哨功能而在于它的编辑模型。它把所有操作拆成了“模式”这是它和绝大多数现代编辑器最本质的区别。普通文本编辑器默认处于“我敲一个字符就插入一个字符”的状态而Vim默认处于“我敲一个字符代表一个命令”的状态。这两种状态的差异就是“觉得Vim难用”和“觉得Vim真香”的分水岭。1.2 三种核心模式普通模式、插入模式、命令行模式Vim最核心的模式有三个普通模式Normal ModeVim启动后默认所在的位置。在这个模式里你按下的每一个键都是一个命令比如j是向下移动一行x是删除当前字符dd是删除整行。这也是Vim效率的根源手指不用离开键盘去摸鼠标所有操作都在主键盘区完成。插入模式Insert Mode这个模式才是真正往文件里输入文字的状态。你可以通过普通模式下的i、a、o等命令进入进入后就和记事本一样敲什么字符就出现什么字符。按Esc键返回普通模式。命令行模式Command-line Mode按:进入底部会冒出一个输入框供你输入保存、退出、替换等命令。比如:w保存、:q退出、:%s/old/new/g全局替换。这个模式承载了Vim几乎所有“批量操作”的能力。理解这个“模式”设计之后你就能明白为什么网上大家都在说“Vim的学习曲线陡峭”。因为它要求你的脑子里始终保持一根弦我现在在哪个模式我按这个键是想编辑还是想发命令1.3 模式切换其实是对效率的极致追求有人可能会问既然插入模式才能打字为什么不干脆默认就在插入模式按需切换到普通模式答案是如果默认在插入模式那所有编辑命令都要加上复杂的前缀才能触发或者是靠鼠标点选菜单反而绕远路。Vim的思路是“默认状态双手放在键盘核心区随时准备执行命令需要打字时再进入插入模式”。这种设计看似增加了切换成本但实际操作中一旦形成肌肉记忆效率会比鼠标点选高出一大截尤其是在大量重复修改同一个文件、同一类内容的时候。2. 打开、保存、退出入口与出口也是新手最容易卡住的环节2.1 用命令打开文件而不是双击在终端里启动Vim的方式非常简单vim 文件名 # 直接打开文件 vim -R 文件名 # 以只读方式打开防止手滑 vim 文件1 文件2 # 一次打开多个文件用:next / :prev切换如果你用的不是本地终端而是通过远程工具连接到服务器那么在没有任何图形界面的环境里Vim几乎是修改配置文件的唯一选择。这也就是为什么“vim是linux常用命令大全”里几乎永远有它一席之地的原因——图形界面可以没有Vim不可以。2.2 保存与退出的完整命令表很多人卡在退出这一步其实是因为Vim的退出命令“细分得可怕”。我把常用的整理成一个表格你们对照着用就清楚了命令作用使用场景:w保存不退出改完一部分先落盘:q退出不保存未做修改直接走人:wq保存并退出最常用的组合:x保存并退出与:wq效果类似ZZ保存并退出普通模式下直接按大写ZZ:q!不保存强制退出改乱了不想保存直接放弃:wq!保存并强制退出文件只读时强行写入后退出:e!放弃修改重新加载文件把文件恢复到上次保存的状态我个人的习惯是普通模式保存用ZZ想“保存退出”一步到位手不需要离开主键区。但是要注意ZZ和:wq在大多数情况下等价唯一的细微差别是如果文件没有内容变化ZZ可能不会更新文件时间戳这个差异在绝大多数场景里无人在意。2.3 退出困境当你“退不出去”的时候怎么办我在新手阶段遇到的一个典型提示是E37: No write since last change (add ! to override)这个意思是说文件有改动你没保存就想退出Vim怕你误操作拒绝了。解决办法有两个想保存退出输入:wq不想保存确认放弃所有改动输入:q!。还有一个更尴尬的情况你按了CtrlS想把文件保存结果终端整个卡住了。这其实是终端的心电感应——CtrlS在终端里默认是“冻结输出”的快捷键你按了之后屏幕不动不是关机也不是死机按一下CtrlQ就能解冻。这个坑我有太多同事踩过看到屏幕卡住直接关终端结果之前的改动全没了。3. 光标移动从逐字蠕动到跳跃式巡航3.1 hjkl为什么偏要这几个键绝大多数人对Vim移动命令的第一印象是为什么不用方向键方向键能用但是你的右手需要从主键盘区挪到方向键区来回折腾就慢了。Vim的移动键h、j、k、l分别对应左、下、上、右全部集中在默认手位附近手指几乎不用位移。顺带回答一个特别常见的疑问很多人打开Vim后按方向键屏幕没有移动光标反而出现了A、B、C、D这样的字符。这是老式终端和Vim版本不兼容的表现或者是API模式的问题。解决办法有两个一是老老实实用hjkl这本来就是你该用的二是在配置里加上对方向键的支持。但从效率角度来看建议直接把hjkl练成肌肉记忆。3.2 按“词”移动而不是按“字符”蠕动逐字符移动是新手阶段等你熟练之后一定不要停留在hjkl上。Vim真正的效率提升从“按词移动”开始命令作用w跳到下一个单词开头e跳到当前或下一个单词结尾b跳到前一个单词开头0跳到行首第0列^跳到行首第一个非空白字符$跳到行尾举个例子你在一行很长很长的配置里想改一个中间位置的参数。如果按字符移动你得一直按l按到手酸但如果你知道参数在哪个词的边界几次w、e就能精准定位。老手改文件的时候视线几乎不在键盘上他们靠的是这种“词的节奏感”。3.3 行内定位与括号跳转编辑代码时经常要在行内快速移动到某个特定字符。这时f命令就非常好用fx会跳到当前行下一个x字符处如果你想反方向找用Fx。找同一个字符的后续匹配用;重复上次f查找,反向重复。比如你想跳到行内某处的一个引号附近输入f光标瞬间落在引号上接着按;跳到下一个引号。写代码还有一个场景光标在一个函数调用的(左边想跳到它对应的)去。Vim在普通模式下按%可以在成对的括号之间跳转。非常多程序员不知道这个命令改代码时一边数括号一边手动移动痛苦程度极高。3.4 文件级跳转比重力感应还顺滑在文件里快速移动有几个高频命令gg跳到文件第一行G跳到文件最后一行行号G跳到指定行比如42G直接去第42行CtrlD向下翻半屏CtrlU向上翻半屏CtrlF向下翻一整屏CtrlB向上翻一整屏{跳到上一个空行段}跳到下一个空行段。我在调试日志文件时最常用G到文件末尾看最新日志再用?error反向搜索关键错误信息。这个组合几乎每天都要用几十次。3.5 数字与命令的组合Vim效率的第一层心法Vim里几乎所有移动命令前面都可以加数字来表示重复次数。3w是往后跳三个词5j是向下走五行。我见过很多老手修改一个文件时一眼扫过去就知道要往下走多少行直接8j到达目的地整个过程行云流水。数字不只能搭配移动还能搭配删除、修改等命令这个在下一节里一起讲。现在你要记住的核心逻辑是Vim的命令就像搭积木动词数字对象。理解了这个组合逻辑你的操作就从“一个一个按键”进化成了“一句话下达指令”。4. 增删改从基础编辑到“动词对象”的组合思维4.1 进入插入模式的方式i、a、o的区别进入插入模式不是你想象的只有一个i键。Vim贴心地准备了多种入口命令作用典型场景i在光标之前插入想在某个字符前加内容a在光标之后插入想在某个字符后追加内容I跳到行首非空字符前插入在行首补一个缩进或符号A跳到行尾插入在行尾写分号或改结尾o在当前行下方新开一行插入在代码块内快速加一行O在当前行上方新开一行插入在函数前面补注释我自己的体会是A和o的使用频率远高于i。因为写代码时最频繁的两个动作是“在行尾加分号”和“在下一行写新语句”。直接按A或o省去先按End再按回车的时间。4.2 删除x是删字符dd是删整行但它们背后有一个逻辑删除命令看起来很多实际上遵循着同一个逻辑x删除光标处一个字符dd删除整行dw删除一个词d$删除光标到行尾。发现规律了吗d是一个动词后面跟一个移动命令表示“删除到什么位置”。所以d3w是删除三个词d2j是向下删除两行。这个“动词移动对象”的思路是整个Vim命令设计最精华的地方。只要你记住d是删除y是复制c是修改后面换成任意移动命令就能组合出无穷无尽的编辑命令。命令作用x删除光标处字符dd删除整行dw删除到词尾d$删除到行尾d0删除到行首dG删除到文件末尾d}删除到下一个空行段4.3 修改与替换r、c、s的微妙差异修改和删除的区别在于删除后你还要进入插入模式输入新内容。c就是“删除进入插入模式”的组合。cw删除一个词并进入插入模式cc删除整行并进入插入模式c$删除到行尾并进入插入模式。这个命令非常实用因为它把“删除”和“输入”两个动作合并成了一个。r是单字符替换rx会用x替换光标处的字符改完后自动回到普通模式不会进入插入模式。R则进入替换模式后面输入的每个字符都会覆盖当前位置的字符像覆盖写一样按Esc退出。s删除当前字符并进入插入模式S删除整行并进入插入模式。从功能上说s约等于xiS约等于ddO。不过作为老手我建议你记住c这个更通用的动词其他特殊写法可以查表理解。4.4 撤销、重做和重复Vim给“后悔药”的剂量很足在普通模式下u撤销上一次操作CtrlR重做撤销的上一步可以找回来.重复上一次修改操作。这三个命令里u和CtrlR大家都熟悉但.这个命令很容易被忽略。实际上它是Vim里最高频的命令之一。比如你想在五个地方各加一个分号不用每个地方都进一次插入模式只要在第一个地方完成修改后按Esc跳到下一处按.修改就会原样重复。这个“录制上一次操作”的机制能让大量重复性改动从十几秒压缩到几秒。4.5 复制、粘贴与寄存器Vim的剪贴板逻辑和系统不太一样Vim中复制命令是yyank粘贴命令是ppaste。yy复制整行yw复制一个词y$复制到行尾。粘贴时p在光标后粘贴P在光标前粘贴。有一个概念初学者必须知道Vim默认的剪贴板和系统剪贴板不是同一个东西。Vim有自己的“寄存器”yy复制的内容放在Vim内部的寄存器里如果你在Vim里复制然后切到浏览器粘贴默认是粘不出来的。想让Vim和系统剪贴板互通需要额外配置或使用y这样的命令把内容复制到系统寄存器。比如在Vim里复制当前整行到系统剪贴板yy从系统剪贴板粘贴到Vim里p使用:reg可以查看所有寄存器的内容。新手不一定要马上搞懂寄存器但要建立这个意识Vim的复制粘贴并不是简单的CtrlC、CtrlV它在底层是一个更强大的机制只是需要你花一点时间去理解。5. 查找与替换从手动翻页到批量精确操作5.1 快速定位斜杠搜索与n/N切换在普通模式下按/输入关键词后回车光标会跳到文件中下一个匹配的位置。n跳到下一个匹配N跳到上一个匹配。如果你搜索的时候不想区分大小写可以在搜索关键词后加\c比如/linux\c。这是查日志、查代码引用时最高频的操作。除了向下搜索/还可以向上搜索用?。?error会从光标位置往前找“error”适合翻日志时回看。还有一个我很喜欢的配置默认搜索时高亮所有匹配项用:set hlsearch开启然后用:nohlsearch临时取消高亮。把它配进vimrc里搜索效率会好很多。5.2 替换的语法范围和目标是关键替换命令的基本格式是:[范围]s/目标/替换/[标志]最常用的几种命令作用:s/old/new/替换当前行第一个匹配:s/old/new/g替换当前行所有匹配:%s/old/new/g替换整个文件所有匹配:3,5s/old/new/g替换第3到第5行:%s/old/new/gc替换时逐个询问确认这里的%代表整个文件g是“全局替换”。不加g的话一行内如果有多个匹配默认只替换第一个。我在帮人排查配置的时候见过太多次了有人执行:s/8080/9090/以为改了所有端口结果只改了每行的第一个8080服务还是起不来。问题不在命令执行失败而是标志位没加全。5.3 利用正则表达式做高级替换替换命令里的目标和替换都支持正则表达式。比如把代码中所有var变量名改成let:%s/\bvar\b/let/g这里的\b表示词边界防止把variable这种单词里的“var”也替换掉。实际工作中我还经常用分组。比如有一个配置文件的格式是keyvalue我想把它改成key: value可以使用捕获组:%s/\(.*\)\(.*\)/\1: \2/g这个命令的意思是把整行拆成两部分第一部分是等号左边第二部分是等号右边然后用冒号重新拼接。Vim的正则语法和常见的PCRE略有区别\(和\)用来标记分组这一点新手容易踩坑写反了或者漏了括号会导致替换结果变成一堆奇怪的字符。5.4 实战一次批量替换的完整过程假设我现在要修改一个nginx站点配置文件想把所有listen 80改成listen 8080同时把server_name old.example.com改成server_name new.example.com。我的操作顺序是输入/listen 80确认有哪些位置需要修改执行:%s/listen 80/listen 8080/g执行:g/old.example.com/s//new.example.com/g按:wq保存退出。注意第3步里:g是全局行匹配把包含特定模式的行交给后面的s命令处理。这个写法和普通替换不同但它能精准限定范围在处理大型配置文件时非常有用。6. 分屏、多文件与缓冲区同时处理多个对象的协作方式6.1 缓冲区Buffer到底是个什么概念当你用Vim打开多个文件时它们在Vim内部叫“缓冲区”。缓冲区可以理解为内存中加载的文件副本。用:ls可以列出当前所有被打开的文件缓冲区用:bnext和:bprev在缓冲区之间切换。如果你用vim file1 file2打开两个文件默认显示在屏幕上的只有第一个文件第二个文件已经加载到内存里了你可以通过buffer 2或:b file2切换过去。这个概念和图形界面里的“标签页”有点类似但Vim的缓冲区更轻量。我在处理跨文件改动时经常同时打开几个配置文件用:b快速切换比反复退出再打开高效得多。6.2 分屏同时看两个文件区域如果只是想同时看一个文件的两个不同位置或者同时看两个文件可以用分屏命令作用:sp 文件名水平分屏打开文件:vsp 文件名垂直分屏打开文件CtrlW w在不同分屏之间切换焦点CtrlW 方向键按方向切到指定方向的分屏CtrlW q关闭当前分屏CtrlW 让所有分屏尺寸均分屏幕我最常用的场景是一边打开源代码文件一边打开对应的配置文件或接口文档。改代码的时候参考旁边的参数名不用来回切换窗口思路不会断。6.3 标签页像浏览器一样管理多个文件Vim的标签页命令和浏览器的标签页概念很接近:tabnew 文件名在新标签页打开文件gt切到下一个标签页gT切到前一个标签页:tabclose关闭当前标签页。标签页适合同时维护多个“任务上下文”。比如我在改A项目代码时开着A的配置和源码突然要去看B项目的一个引用就新建一个标签页打开B项目文件改完再切回来。不过说实话标签页在Vim里的使用频率比分屏低很多大多数老手更习惯用缓冲区方案你可以按自己的习惯选。6.4 与外部命令协作Vim不只是关起门来编辑在Vim的:!命令可以执行外部命令并且不退出Vim。比如:!ls列出当前目录文件:!python3 %运行当前Python文件%代表当前文件名:read !date把外部命令输出插入到当前光标之后。这个能力非常实用。我经常在写文档时用:read !date插入当前时间或者用:!gcc -Wall %快速检查C代码是否能编译通过。7. 让Vim“听话”用.vimrc完成第一次个人化改造7.1 配置文件的位置与最小配置Vim的所有配置都写在~/.vimrc文件里。没有这个文件就新建一个。我建议新手从一份“最小可用配置”开始理解每一个配置项是干什么的不要一上来就拷贝网上几百行的“装机必备配置”你不知道那些配置是干什么的出了问题也排不出来。一个实用的初始配置模板如下set number 显示行号 set relativenumber 相对行号便于快速跳转 syntax on 开启语法高亮 set tabstop4 一个Tab键显示为4个空格 set shiftwidth4 自动缩进为4个空格 set expandtab 输入Tab时自动转成空格 set autoindent 继承上一行缩进 set hlsearch 搜索高亮 set incsearch 边输入边搜索 set ignorecase smartcase 搜索时智能大小写 set mousea 启用鼠标支持可选 set clipboardunnamedplus 让复制粘贴使用系统剪贴板这里每一个配置项都值得你亲手试一下效果。比如number和relativenumber同时开启的时候Vim会显示相对行号配合5dd这样的命令特别好用expandtab决定了你按Tab时插入的是Tab字符还是空格这在写Python时尤其重要混用Tab和空格会直接报缩进错误。7.2 键位映射与Leader键把常用操作变成“快捷键”Vim支持自定义键位映射语法是nnoremap K gT nnoremap J gt nnoremap Leaders :wCRLeader是一个默认的按键前缀默认是反斜杠\。我习惯把它改成空格键let mapleader 然后把高频操作映射到Space组合上。比如nnoremap Leaderw :wCR 保存 nnoremap Leaderq :qCR 退出 nnoremap Leaderv :vspCR 垂直分屏 nnoremap Leaderh :nohlsearchCR 取消搜索高亮映射的本质是把多个按键压缩成一个按键。在学习Vim的初期先不用急着配一堆映射等你意识到“我经常执行某个三步操作”的时候再去把它映射起来这样配置出来的vimrc才是真正为你工作的。7.3 模式行让文件自己指定格式网络热词里有个“vim: set ft”这实际上和Vim的“模式行”有关。模式行是写在文件头部或尾部的一行特殊注释用来告诉Vim这个文件应该用什么样的格式打开。比如在Python文件第一行写# vim: set ftpython ts4 sw4 expandtab:Vim打开这个文件时就会自动设置文件类型为pythonTab宽度为4并启用空格缩进。其他同事拿到这个文件时格式会自动统一不需要每个人各自改配置。这是团队协作时非常实用的小技巧。7.4 插件管理入门自动补全和主题说到“vim配置”必然绕不开插件。现代Vim用户几乎都使用插件管理器最常用的是vim-plug。安装插件前先要下载vim-plug脚本然后在.vimrc中声明插件call plug#begin(~/.vim/plugged) Plug preservim/nerdtree 文件树 Plug dense-analysis/ale 语法检查 Plug neoclide/coc.nvim, {branch: release} 补全 call plug#end()保存后执行:PlugInstall安装插件。插件装好之后Vim就从一个纯粹的编辑器变成了带补全、带文件导航的轻量级IDE。不过我要提醒一句插件的优先级永远排在“熟练掌握原生命令”之后。如果你连w和dd都要想一下装再多插件也只是给自己添乱。8. 真实工作流中的Vim三个高频场景复盘8.1 场景一在服务器上修改nginx配置假设现在线上nginx端口要从80改成8080。第一步我执行vim /etc/nginx/nginx.conf打开主配置。先输入/listen搜索所有监听端口用n逐个确认。如果配置文件比较大我会直接:%s/listen 80/listen 8080/g整体替换。替换完成后不急着退出先看一眼错误日志里有没有“address already in use”之类的提示确认没问题了再:wq保存退出。这个过程中查找、跳转、替换、保存四个命令全部用上了没有一个多余操作。8.2 场景二从日志文件里筛选有效信息我拿到一个几十万行的access.log想找出所有来自某个IP的请求。直接打开Vim输入:v/192.168.1.10/d这个命令的含义是删除所有不包含指定IP的行。:v是“反向匹配”d是删除。执行完文件里只剩下目标IP的请求行。如果想把这些行另存一份不需要手动复制直接:w filtered.log保存为另一个文件即可。这就是Vim和记事本类编辑器最大的区别它不是靠你肉眼滚动去找内容而是可以一行命令对全文件做筛选和裁剪。8.3 场景三批量修改代码缩进从网上复制了一段别人写的代码缩进全乱了。选中多行在可视模式下输入Vim会自动按照语法规则重新格式化缩进。如果你不想进可视模式直接ggGgg跳到第一行G表示格式化到文件末尾全文件缩进在一瞬间被理清。这个命令在接手别人代码的时候简直是救命稻草。9. 常见问题与避坑记录踩过的坑列出来给你看9.1 按方向键变成ABCD出现这个情况大概率是因为当前终端把方向键序列识别成了普通字符或者Vim进入了某种不兼容模式。我的建议是直接改用hjkl并且把它当作固定习惯。如果你实在离不开方向键可以在.vimrc中做如下映射inoremap Up C-ogk inoremap Down C-ogj但这个方法只能缓解不能治根。方向键在Vim里从来不是高效的选择它只是一个兼容性的妥协产物。9.2 打开文件全是乱码中文字符显示乱码通常是文件编码不是UTF-8。比如从Windows拷贝过来的文件可能是GBK编码。在Vim里可以这样处理:set fileencodingsutf-8,gbk,latin1 :e encgbk第一条命令让Vim自动检测编码第二条命令按GBK编码重新加载文件。如果文件打开后内容仍然乱但确定原文件是GBK可以试试::set fileencodinggbk :w强制以GBK编码保存。遇到编码问题不要慌先搞清楚源文件是什么编码再决定用什么编码去打开或保存。9.3 CtrlS把终端冻住了这个前面提过一次但值得再强调一遍CtrlS在终端里是“停止输出”的控制信号不是Vim里的“保存”。按CtrlS后屏幕冻结任何输入没反应解决办法是按CtrlQ恢复。如果你希望Vim里不出现这种情况可以在终端设置里禁用CtrlS的流控或者干脆改掉这个习惯。9.4 误入Ex模式找不到出口如果你不小心按了QVim会进入Ex模式底部提示符变成冒号此时普通编辑命令全部失效。这不稀奇很多老手在升级Vim后都中过招。退出Ex模式的方法是输入:visual然后回车或者直接按Esc回到普通模式。如果你根本不想让Q触发Ex模式可以在配置里映射nnoremap Q nop把Q键变成一个空操作彻底杜绝误入。9.5 额外分享一个我自己用了很久的小技巧在普通模式下g;可以跳到上一次修改的位置g,继续往前跳。这比CtrlO跳转更精细专门用来在“位移”和“修改点”之间快速往返。我改代码时的习惯是每改完一个地方用g;回到上一个修改点复查一遍逻辑避免改完A忘记B的联动。这个小命令不在绝大多数“Vim常用命令清单”里但是对真实编码场景的帮助极大。Vim的命令体系就像一个工具箱你不需要一次学会所有工具但每学会一个就能在某个场景里节省几秒钟。这几秒钟在每天几十上百次的重复操作中积少成多最终带来的是那种“手比脑子快”的流畅感。用Vim久了你会发现自己不再纠结哪个编辑器最强而是把注意力放回了内容本身。希望这篇命令梳理能帮你跨过“不知道按什么”的坎在真实工作里顺畅地把文件改完、保存、退出然后回家好好睡觉。
返回列表