ARTICLE DETAIL

资讯详情

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

Vim零散命令实战:从查找替换到宏录制提升编辑效率

Vim零散命令实战:从查找替换到宏录制提升编辑效率 用vim时间长了你会发现真正让我效率起飞的不是什么重型插件而是那些“零散的快捷方式 和命令”。vimer之间交流往往就是扔出一句“ddp”“ciw”“:%s/foo/bar/gc”听的人点头不熟的人一脸懵。这篇就专把这些零散的vim命令、快捷键和日常坑整理出来覆盖查找字符串、多文件操作、宏录制、sudo vim这类高频场景也说说每个命令背后的为什么。如果你刚开始接触vim或者用了很久还是只会i、Esc、:wq这篇应该能帮你把编辑效率往上拉一大截。1. 为什么说vim的“零散记忆”才是核心竞争力1.1 编辑工具的核心让手指形成肌肉记忆很多人第一次打开vim都会劝退因为命令实在太多普通模式、插入模式、命令行模式混在一起记不住。但我在实际用了七八年之后回头看真正需要天天用的命令其实不超过二十个那些花哨的、极端场景的命令一年也碰不了几次。问题不在于把命令背下来而在于把最常用的那一批练成肌肉记忆。举个生活化的例子开车不需要懂发动机内部构造但必须把油门、刹车、后视镜这些动作练到条件反射。vim里的零散命令就是编辑文本的油门和刹车。比如在普通模式按dw删掉一个单词按ciw直接改掉光标所在的单词按dd删除整行再按p把它粘贴到别处。这些操作如果每次都要想“dw是什么意思、w是什么范围”效率反而比鼠标还低只有变成手指自己动才真正快。我的做法是给自己整理一张小卡片正面写光标移动背面写删除复制粘贴每天只练其中一组。坚持一个月后很多命令已经不需要经过脑子光标想往哪走手指自己就按下去了。零散并不可怕可怕的是一直停留在“输入i然后按方向键”的原始状态。1.2 零散命令背后的设计哲学模式编辑与复合命令vim的命令看起来零散其实背后有一套特别清晰的语法操作符 动作对象。d是删除w是单词$是行尾所以d$就是从光标删到行尾c是修改i表示引号内全部内容所以ci就是直接重写这对引号里的内容。一旦理解了这种“动词范围”的组合方式你就不必死背每一条命令遇到类似场景可以自己推导出来。这也是vim最迷人的地方它不是一个“软件”而是一门“文本编辑语言”。普通模式下按的每个键都像一个词组合起来就是一个完整的操作指令。很多人总是说vim快捷键太多、记不住其实只要抓住“模式”这个核心普通模式负责操作文本插入模式负责输入文字命令行模式负责保存、退出、替换零散命令就能串成一条线。我在带新人时经常强调先别急着配插件、配主题先把模式切换和命令语法练熟。因为插件只是锦上添花真正决定效率的是你能不能在一秒内把光标放到目标位置、用一个复合命令完成“删除引号内文字并重新输入”。这个能力一旦建立后面学任何高级功能都特别快。2. 高频核心命令与快捷方式速查2.1 光标移动与翻屏别再用方向键了vim里最基础也最容易被忽略的是光标移动。方向键能用但每次移动一个字符手还要离开主键盘区效率很低。普通模式下建议完全改用字母键移动n键在键盘中间不离开主干道长期用下来手和眼睛负担都小很多。高频移动命令整理成表格看更清楚命令作用使用场景hjkl左、下、上、右移动光标日常微调w/b按单词向后/向前跳英文代码里快速移动e跳到单词结尾配合修改命令很实用0/^跳到行首/行首第一个非空字符对齐缩进代码时用$跳到行尾快速到行尾继续编辑gg/G跳到文件首行/末行大文件快速定位Ctrlu/Ctrld上/下翻半屏阅读长文件Ctrlf/Ctrlb上/下翻整屏段落间跳转zz/zt/zb光标所在行居中/置顶/置底调整视野让代码居中看其中w、b、0、$是我一天用几百次的组合。很多人觉得w只能按普通单词跳但它在代码里同样会按标点和符号分词配合数字还能跳得更远比如3w向后跳三个词。调试配置文件时快速从上一个节点跳到下一个节点比用鼠标点准快太多。翻屏这块还要提醒一下Ctrlu和Ctrld不是整页滚动而是半屏我个人更喜欢这种因为保留上下文不容易看丢位置。整屏翻页适合读长文档半屏适合改代码两者配合着用是最高效的。z系列三兄弟很多人不熟其实写代码时经常遇到当前行被挤到屏幕下边缘的情况按一下zz把当前行放到屏幕中间眼睛舒服很多。2.2 插入模式的进入与退出弄懂“模式”才是关键vim的“普通模式”和“插入模式”是两套完全不同的世界。普通人最容易犯的错就是一进vim就按i开始打字打完之后不知道怎么退出然后到处乱按。对新手来说第一件事不是学怎么插入文字而是要学会“怎么回到普通模式”。插入模式的进入方式其实有五种常用变化i在当前字符左边插入I在行首插入a在当前字符右边追加A在行尾追加o在下方新开一行并进入插入模式O在上方新开一行并进入插入模式这六个键使用频率极高。尤其o和O写代码时经常需要在下一行或上一行插入内容按一下就能新开一行并自动缩进比先到行尾再回车省事得多。退出插入模式的标准键是Esc我建议再学一个Ctrl[两个键同时按就行手不用伸太远而且很多终端下响应更快。插入模式里还有一些容易被忽略的小命令Ctrlh删除前一个字符Ctrlw删除前一个单词Ctrlu删除到行首。这三个组合键在不小心打错一串内容时特别好用尤其在终端里粘贴内容出错可以快速回退。我经常推荐朋友把终端里的删除键改成Ctrlh和vim保持一致跨工具都很顺手。另外提一个常见的坑不要用Ctrlc代替Esc。虽然它也能退出插入模式但vim有时会把Ctrlc当成中断信号在某些插件或快捷键体系下行为不完全一致。最稳妥还是用Esc或Ctrl[把肌肉记忆固定下来能少踩很多雷。2.3 删除、复制、粘贴与撤销四类命令一次理清删除、复制、粘贴、撤销是日常编辑的四大支柱它们之间不是孤立的。在vim普通模式里dd删除整行yy复制整行p粘贴到光标下方P粘贴到光标上方。这组命令我建议连起来练跳到要复制的行yy再跳过去p完成一次搬运。删除命令里有个非常重要的概念vim的“删除”更像是“剪切”被删的内容会进入无名寄存器随时可以用p粘贴回来。很多人删完发现内容没了就喊“完了”其实只要按一下p刚才删掉的东西就出现了这是vim比图形编辑器更灵活的地方。常用删除复制命令命令作用备注x删除光标所在字符等价于dldd删除整行其实是剪切dw删除到单词结尾包含空格d$/D删除到行尾很常用d0删除到行首注意包含行首空字符diw删除当前单词但不删空格比dw少删一个空格yy复制整行等于Yy$复制到行尾很常用p/P粘贴到光标下方/上方小写和大写注意区分我看到很多初学者会混淆dw和diwdw会连单词后面的空格一起删diw只删单词本身。在英文代码里我基本都用diw因为删完不会留下多余空格而dw更适合“删除这个词并替换成另一个”的场景。类似地ciw是“改整个词”cw是“从光标改到词尾”一字之差行为完全不同。撤销和重做也很关键u撤销一步Ctrlr重做。这在改错配置、误删内容时是救命稻草。但要注意vim的撤销是以“进入插入模式到退出的整个过程”为一步的如果你在插入模式里连续输入了一整段文字按一次u会把整段都撤销掉而不是一个字一个字地撤这是vim和普通编辑器的行为差异之一。了解这个特性后反而可以利用它在插入模式中先敲一大段如果发现方向不对一次撤销直接回到插入前效率极高。3. 查找替换与跨文件操作实操3.1 字符串查找从基础搜索到高亮与取消高亮“vim 查找字符串”是我经常被问到的一个需求。基础操作很简单在普通模式按/输入要搜的词回车就会跳到下一个匹配位置。?是向上搜索n跳向下一个匹配N跳向上一个匹配。比如排查报错日志只需要/ERROR回车再一直按n就能把日志里的错误位置全部过一遍非常顺手。还有两个高频快捷键把光标放到某个单词上按*会向下搜索当前单词按#会向上搜索。这个在代码里查函数引用、查变量名时特别好用不需要手动输入搜索词。我写代码时几乎每天都用*跳转到下一个同名变量再改。比用鼠标选中再复制搜索快得多。搜索默认是区分大小写的但很多场景下我们不想区分。可以在vimrc里加set ignorecase set smartcase这两行配合起来的效果是如果你搜索的词里有大写字母就区分大小写如果全小写则不区分。比如搜Error只查大写开头搜error能同时匹配Error、ERROR、error很智能。搜索之后vim默认会把所有匹配项高亮很多新手被满屏黄色吓一跳。高亮本身是好用的但等你改完代码高亮还留着碍眼可以用:nohlsearch临时取消高亮不影响下次搜索。如果你很少需要这个功能也可以直接在vimrc里写set nohlsearch让vim默认不高亮。我在搜索长字符串时还会用正则表达式。vim的正则语法和Perl略有不同但基本够用。比如搜行尾空白/\s\$搜中文注释/[\u4e00-\u9fa5]。搜索时按\v可以切换到“very magic”模式正则语法更接近直觉适合复杂匹配。这个属于进阶玩法建议先把基础搜索练熟再试。3.2 替换命令的三种姿势单次、全局、带确认替换是vim命令里重量级功能比IDE自带的全局替换更灵活。命令格式是:s/old/new/本质上是在当前行把第一个匹配的old替换成new。如果想替换当前行所有匹配后面加g:s/old/new/g。注意这里的g不是全局文件的意思而是“在一行内全局替换”很多人刚学时会搞混以为写g就能全局替换整个文件结果只在当前行生效。真正对全文件生效要加%前缀:%s/old/new/g。这个命令是我最常用的比如整份配置里的http://改成https://一条命令全部替换。%代表整个文件范围也可以理解为“所有行”加上g就是所有行内全部匹配都换两个符号配合才是真正的全局替换。如果替换前想一个个确认就在末尾加c:%s/old/new/gc。这时vim会逐个跳到匹配位置询问你是否替换。y替换n跳过a全部替换q退出l本次替换并结束。这个命令在批量修改但又不确定每个位置是否该替换时特别好用相当于一个轻量级“确认向导”。替换范围也可以指定行号。比如:10,20s/old/new/g只在10到20行之间替换.,.5s/old/new/g从当前行往下5行范围内替换。这在只改局部代码段时非常有价值不用手动选区域也不用担心误伤文件其他位置。还有一个很多人不知道的技巧替换命令的分隔符不一定是/也可以换成#或:。比如路径里有很多斜杠用/做分隔符就会很痛苦写:s#/usr/bin#/usr/local/bin#g就舒服很多。还有替换时如果需要匹配特殊字符反斜杠要写两遍这个容易踩坑比如替换foo.bar中的点号要写foo\.bar。3.3 多文件操作与sudo vim的坑vim除了单文件编辑还支持一次打开多个文件通过缓冲区管理。最直接的方式是启动时写多个文件名vim file1.txt file2.txt然后用:n切到下一个文件:N或:prev回到上一个。这个操作在快速对比两个文件时很实用。更日常的操作是:e filename打开一个新文件:ls查看当前缓冲区列表:bn切到下一个缓冲区:bp切到上一个:bd关掉缓冲区。这些命令看起来零散但组合起来就是一套多文件工作流。我经常同时开着代码文件、配置文件、测试文件用:ls看一眼编号再:b 3直接跳过去比鼠标点标签栏快。分屏和多标签页属于另一个话题但“多文件”这个词在vim里还有一个很常见场景你打开了一个系统配置文件比如/etc/nginx/nginx.conf当前用户没有写权限直接vim打开后保存会提示“E45: readonly option is set”。很多人的反应是用sudo vim重新打开这当然是最直接的办法。但如果已经打开文件、修改到一半才发现需要root权限怎么不退出直接保存可以用:w !sudo tee %。这行命令的意思是把当前缓冲区的内容通过sudo tee命令写回当前文件。%在vim里代表当前文件名非常巧。用的时候vim会提示你sudo需要输入密码输入后就能保存。要注意这个技巧适合临时救急如果文件本身需要频繁编辑还是应该用sudo vim打开或者检查文件权限归属否则保存后所有者和权限可能都不符合预期。多文件操作里另一个建议不要在一个文件里写太久不保存vim有:set autowrite选项切换缓冲区时自动保存当前文件可以避免忘记保存导致丢失。在开发场景下我通常开一堆文件边改边切换autowrite能省很多心。4. 日常开发中的神级快捷方式提升效率4.1 块操作、宏录制与寄存器vim的普通命令处理单行、单词很在行但批量处理多行内容时块操作和宏录制才是真正的大杀器。块操作的基础是按Ctrlv进入可视块模式然后移动光标选中一个矩形区域按I在块内所有行的相同位置插入内容按Esc生效。比如给连续十行代码前面加注释符//只需Ctrlv框选第一列按I输入//再按Esc十行全部加上。这个操作我几乎每天用比手动逐行加注释省太多时间。同理想批量删除某一列的内容也可以用Ctrlv框选后按d一次删除。块操作也可以用来把多行行尾统一改成相同内容方法类似选到行尾按A追加再Esc。理解“矩形选区”这个概念是块操作的核心它和普通v的可视选区完全不同。宏录制则是另一个维度的自动化。把一串复杂的重复操作录下来然后一键回放。录制方法特别简单普通模式按qa开始录制到寄存器a然后正常执行你要重复的操作再按q结束录制。之后每按一次a就重放一遍重放上一次执行的宏。如果要在连续多行重复可以用5a连续执行五次。比如我经常要把一份表格的每一行后面都加一个分号。手动做法到行尾、插入分号、下一行重复几十次。用宏录制的做法在第一行执行一次完整操作录到q寄存器然后选中剩余行按5a批量执行。录制过程中最需要注意的是移动方式要稳定最好用j移动而不是方向键否则宏回放时位置会错乱。寄存器是宏和复制粘贴的结合点。ayy把当前行复制到寄存器aap粘贴寄存器a的内容。寄存器还有几个特殊角色0保存最近一次复制的内容是系统剪贴板:reg可以查看所有寄存器当前内容。我经常把一串固定代码放到寄存器q里在多个文件里反复粘贴比每次去源文件复制方便。4.2 分屏与标签页一个人当三个人用写代码很少只盯一个文件分屏几乎是刚需。vim里:split或:sp水平分屏:vsplit或:vsp垂直分屏:new新开一个水平窗口。分屏之后用Ctrlw后面跟方向键来跳转比如Ctrlw加j跳到下方窗口Ctrlw加l跳到右侧窗口。关闭当前窗口用Ctrlw q其底层就是:q。我个人的习惯是左边放代码右边放测试或文档上下分屏用于对照两个不同函数。分屏比例可以用:resize 20调整或者:vertical resize 80设置垂直宽度。在终端里如果发现分屏后每一栏太窄可以临时Ctrlw 让所有窗口等高宽这个命令在窗口调乱之后救过我很多次。标签页则适合更粗粒度的任务切换。:tabnew file在新标签打开文件gt下一个标签gT上一个标签:tabdo可以对所有标签执行同一命令。标签页和分屏可以混用每个标签页里再分屏就像浏览器开了多个窗口每个窗口再左右分栏。我一般用标签页区分不同项目用分屏区分同一项目内的文件结构清晰。还有一个细节分屏时相对行号会很有用。:set relativenumber让行号显示为“离当前行差几行”配合跳转指令5j、3k特别顺手。在分屏里看第二窗口时一眼就知道当前位置相对目标位置差多少行直接数字方向键跳转。熟练之后鼠标几乎可以下岗了。4.3 快速跳转与书签告别鼠标vim最容易被低估的能力是“跳转历史”和“书签”。跳转历史可以用Ctrlo回到上一个跳转位置Ctrli前进到下一个跳转位置。这里的“跳转”包括搜索匹配、函数定义跳转、行号跳转等。我经常在一个大文件里改了A处又查B处查完按两下Ctrlo就能回到刚才编辑的位置不用再滚动屏幕。书签属于更主动的定位方式。在普通模式按m加一个小写字母比如ma就在当前光标位置放一个书签a。之后想跳回来按a跳到a所在行行首按a跳到a所在的具体列。这个我在处理一篇文章或长日志时特别常用开头做个标记翻到中间查内容查完直接a回来比Ctrlo还精准。vim会把小写字母标记限制在当前文件内大写字母标记可以跨文件。比如在文件A按mA做标记切换到文件B后按A能直接跳回文件A的标记位置。这个功能在跨文件对照时很有用但大多数人根本不知道。还有两个隐含标记回到上一次离开当前窗口的位置.回到上一次编辑的位置。.标记在重新打开文件后依然有效相当于自动给你留了一个“刚才改到哪了”的坐标。gd这个命令也很值得单独提在普通模式把光标放在一个局部变量或函数名上按gd会跳到它的局部定义处在文件内部寻找第一个匹配定义。这比用搜索猜位置快很多尤其在读Python、Go这类代码时gd基本就是轻量级“转到定义”。虽然它不如语言服务器插件那么精确但零配置就能用已经能解决八成需求。5. 常见问题与排查技巧实录5.1 方向键变成ABCD终端键盘问题很多人在终端里用vim按方向键会变成A、B、C、D出现在插入模式里这其实是终端和vim的键盘映射没有对上。普通模式下方向键确实会移动光标但插入模式下方向键应该还是光标移动如果变成ABCD通常是因为vim设置中没有开启必要的兼容选项或者终端没有正确发送方向序列。排查步骤很简单先看vim是否处于兼容模式。在vimrc里写一行set nocompatible或者至少设置set backspaceindent,eol,start大部分终端问题都能解决。如果还不行试试在插入模式下按Ctrl[退出插入模式再按方向键看是否能正常移动。如果普通模式正常、插入模式不正常基本可以判断是光标键发送的转义序列被终端解析成了普通字符这时可以检查终端模拟器的键盘协议设置。另一个容易被忽略的点tmux等终端复用工具也处理键盘序列。我在tmux里用vim时偶尔会遇到方向键不响应的问题原因是tmux的窗口大小切换后vim没有重新获取终端尺寸按一下Ctrlz再fg或者退出tmux重进就好了。其实我更建议的方向键替代方案是普通模式用hjkl插入模式用Ctrl[退出再移动这样完全不需要依赖方向键也不会被终端干扰。刚开始会不习惯但坚持一周后你就会发现手不用离开主键盘区输入和切换反而更顺。5.2 粘贴代码缩进乱掉怎么办用终端粘贴代码到vim经常出现缩进全乱的情况。原因是vim在插入模式下自动缩进会把粘贴进来的内容逐行重新格式化而原本代码里的缩进又被额外的autoindent叠加上去两层缩进叠加代码就没法看了。最简单的解决办法是粘贴前开启paste模式:set paste粘贴完再:set nopaste。开启paste模式后vim会关闭自动缩进、自动换行等影响粘贴的行为内容会原样插入。我建议在vimrc里映射一个快捷开关比如set pastetoggleF2这样按一下F2切到paste模式再按一下关闭不用每次都敲命令。很多新版本vim还会自动处理bracketed paste当终端支持“括号粘贴”协议时vim会自动识别粘贴内容并保留格式不会乱缩进。遇到老版本的vim或某些终端不支持这个协议才需要手动开paste。还有一个技巧如果已经粘贴乱了可以用:undo撤销或者先:set paste再重粘。如果粘贴到一半发现乱了最稳妥的是立刻按Esc退出插入模式按u撤销再重新用paste模式粘贴。记住不要试图手动排缩进那样比重新粘贴还慢。这个问题的根源在于vim会把“用户输入”和“粘贴内容”混为一谈。理解这一点以后你对vim的自动缩进就不会再抱怨了它本来就是给手写代码用的不是粘贴代码用的。以后遇到粘贴乱码第一反应就应该是检查是不是没开paste。5.3 一些实用配置和vim学习路线vim的精髓在命令但一个小巧的.vimrc能把体验拉高一大截。我见过很多刚接触vim的朋友要么裸奔要么一上来就抄一份几百行的配置结果不知道哪一行生效、哪一行报错。我建议配置从最小集开始每一个选项都知道为什么。下面是我认为最值得优先加的几行set nocompatible set number set relativenumber syntax on set autoindent set tabstop4 set shiftwidth4 set expandtab set hlsearch set ignorecase set smartcase set backspaceindent,eol,startset number显示行号set relativenumber显示相对行号两者可以共存expandtab把Tab转成空格避免不同工具看到缩进不一致hlsearch让搜索结果高亮方便看匹配位置。这些配置都不复杂但足够覆盖日常使用而且每一项都能直接感受到作用。学习路线方面我给新手的建议是先跑一遍vimtutor这是vim自带的交互式教学程序一小时就能把基础命令过一遍。然后是刻意练习阶段日常任何文本编辑都强制自己用vim只学四个动作移动、删除、插入、保存。等这四组操作形成肌肉记忆了再按需学替换、宏、多文件。不要一开始就把网上的“最强vimrc”抄下来因为你不知道哪些配置是给谁用的出了问题也不知道怎么排查。我的体会是vim学习更像健身不是看完教程就变强而是日复一日地刺激特定肌肉。每周挑一个新命令专门练比如这周只练ciw下周只练宏录制一个月下来就能积累十几个高频率肌肉记忆。这个过程里你会不断发现“原来这个零散命令可以这样组合”最后变成自己的东西。最后再分享一个小习惯建一个自己的~/.vim/目录把命令笔记放在里面遇到好用的零散技巧就记下来。很多人收藏夹里存了一堆链接但真正内化成自己的很少。vim的魅力就在于这些零散命令一旦组合起来编辑文本的快感会强过任何鼠标操作。
返回列表