ARTICLE DETAIL

资讯详情

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

Vim 常用命令与快捷键实战指南:从入门到高效编辑

Vim 常用命令与快捷键实战指南:从入门到高效编辑 我到现在都记得第一次被人按着在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删除deletey复制yankc修改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命令普通模式下把光标放在路径字符串上按gfVim 会尝试用当前目录作为基准打开这个文件。如果文件不在预期路径下可以设置path选项再试:set path/usr/include/** 追加搜索路径具体按实际项目配置回到上一个文件的快捷键是Ctrl^按住 Ctrl 再按 6 上方的 ^。这个我每天按几十次在头文件和源码之间来回切换时比鼠标点边栏快得多。另一个相关技巧是Ctrlo和Ctrli它们是在跳转记录里前进和后退在处理复杂跳转时非常实用。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 行。日常整理日志、快速翻看长文件时这两个键足够用了。整屏翻页用Ctrlf向下翻一页Ctrlb向上翻一页Ctrld向下翻半页Ctrlu向上翻半页另外H、M、L可以快速把光标定位到当前屏幕的顶部、中部、底部对应英文 home、middle、last 三个位置这是在长代码文件里保持上下文的利器。括号匹配是写代码时的刚需。把光标放在(、{、[上按%可以直接跳到与之匹配的另一半。我查括号不配对的问题时几乎全靠%来回扫比肉眼数括号高效得多。还有一个高频命令是.英文句号它的作用是重复上一次修改操作但它更适合放在编辑部分详细讲因为它是批量修改的灵魂。4. 编辑、复制、粘贴与撤销把手从鼠标上拿开编辑操作是 Vim 里最令人想拍桌子的部分也是熟练之后最爽的部分。核心内容就是删除、复制、粘贴、替换和撤销。4.1 删除、复制、粘贴的内部逻辑删除命令以d开头x删除光标处一个字符等于在普通的 Backspace 前面删dd删除整行dw删除到下一个单词词首d$或D删除到行尾d0删除到行首diw删除光标所在单词不考虑光标在单词哪个位置复制命令对应yyy复制当前行yw复制一个单词y$复制从光标到行尾yiw复制当前单词粘贴用p在光标后粘贴P在光标前粘贴。如果复制的是一整行p会在当前行下方新起一行粘贴如果是单词或字符则排在光标后面。这个行为差异经常让新手困惑理解了“行的复制会以行为单位粘”就清楚了。修改命令c是“删除后进入插入模式”的合成命令cw相当于dw后再进入插入模式cc清空整行并插入c$清空到行尾并插入。写代码改函数名、改变量名时cw特别顺手。交换内容时还有一个隐藏知识点Vim 删除的内容不是直接丢弃而是存进寄存器。所以dd并不会真的“删没”你可以直接p把它粘到别处。这跟系统剪贴板是两套体系日常使用足够但如果你发现剪贴板内容丢失大概率是 Vim 的寄存器机制和系统剪贴板没有打通。后面配置部分我会讲怎么打通。撤销与重做也在这一块u撤销Ctrlr重做.重复上一次修改.命令是我个人最依赖的快捷键。比如你要把文件里的多个“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。这在整理缩进混乱的配置文件时比手动ShiftTab高效太多。5. 可视模式、宏录制与分屏从单点操作走向批量处理Vim 真正拉开与普通编辑器差距的地方是批量处理能力。可视模式让你能看清楚选区再操作宏录制则帮你把重复动作自动化。5.1 可视模式的三件套可视模式分为三种v字符可视模式可以逐字符选择V行可视模式按行选择Ctrlv块可视模式以矩形块选择块可视模式是最有威力的工具。比如多行行首都要插入内容你可以把光标移到第一行行首按Ctrlv然后按j向下扩展到多行再按大写的I输入内容最后按Esc所有选中行行首都会插入同样内容。这个操作我在给 CSS 属性加前缀、给 Markdown 列表统一加符号时用了无数次。反过来块模式也能批量删除一列。比如每行末尾都有一个多余的空格或逗号选中后按x一次删干净。有些文本文件是空格对齐的表格用块选择框住某一列以后可以整体复制、拖动甚至交换两列位置这比在 Excel 里操作还方便。如果选完以后想重新调整选区gv可以重新选中上次的可视区域不用从头再来。这在实际反复测试替换范围时特别有用。5.2 宏录制与寄存器宏录制的基本流程是普通模式下按q再按一个字母比如qa开始录制到寄存器 a。做一系列操作。再次按q停止录制。按a回放这个宏重复最近一次宏调用。我给你举一个真实的例子。有一次我需要把一个文本文件里的第 2 列和第 3 列互换格式是空格分隔的多行。手工做可能要重复一百次但录一个宏就解决qa 开始录制到寄存器 a 0f 空格 跳到行首然后 f 空格 找到第一个空格 dW 删除到下一个单词词首 w 移动到下一个单词 p 粘贴 q 停止录制 a 回放一次回放后检查效果没问题就可以用99a或者配合:1,100normal a对前 100 行批量执行同一宏。normal命令是 Vim 里批量执行普通模式命令的好帮手非常推荐掌握。寄存器方面最常见的需求是把 Vim 复制的内容粘贴到系统其他程序里。默认情况下Vim 的复制内容不进入系统剪贴板但装了图形界面的 Vim 或终端支持剪贴板时你可以用y复制到系统剪贴板用p从系统剪贴板粘贴。没有这个需求时不用管但如果你的 Vim 版本显示-clipboard说明编译时没带剪贴板支持得安装图形版 Vim 或者vim-gtk3。5.3 分屏与窗口管理分屏操作比想象中简单:sp水平分屏另一个窗口显示同一个文件:vsp垂直分屏Ctrlw后按w在窗口间切换Ctrlw后按h j k l按方向切换窗口Ctrlw后按让所有窗口大小均等Ctrlw后按_最大化当前窗口高度Ctrlw后按|最大化当前窗口宽度Ctrlw后按c关闭当前窗口分屏的真正价值在于对比两个相关文件比如一边看 HTML 一边看 CSS或者一边看接口文档一边写代码。比起来回打开多个终端窗口管理规则一旦形成肌肉记忆切换成本趋近于零。6. 个人配置与自定义快捷键的定制思路Vim 默认设置谈不上新手友好但几乎所有槽点都能通过.vimrc消除。配置文件位置一般在~/.vimrc装好后第一件事就是自己写一个保存为普通文件即可。6.1 新手提供安全感的推荐配置以下是我个人常年用得最顺的几行基础配置set number set relativenumber set tabstop4 set shiftwidth4 set expandtab set autoindent set nowrap set incsearch set hlsearch set ignorecase smartcase 搜索时忽略大小写但输入大写时精准匹配 syntax on set encodingutf-8 set fileencodingsutf-8,gbk,big5 处理中文编码 set backupdir~/.vim/backup set swapfile set timeoutlen500set number显示绝对行号set relativenumber显示相对行号两者组合后 Vim 会在当前行显示绝对行号其他行显示相对行号这非常有利于配合d5j这类“向下删 5 行”的操作因为你能直接看到距离。中文服务器环境里的乱码问题靠encoding和fileencodings配置能解决大部分。一次改配置文件时遇到 GBK 编码默认情况下中文全乱手动指定:e encgbk或者用fileencodings让它自动识别之后就能正常显示和保存。set timeoutlen解决的是“按 Esc 延迟”问题。默认情况下 Vim 等待特殊键的时间太长导致从插入模式退出时有肉眼可见的延迟。调低到 500 到 1000 毫秒会顺滑很多。6.2 映射命令与 Leader Key自定义快捷键的基础是映射命令。最常见的几个map同时生效于普通模式和可视模式nmap仅普通模式imap仅插入模式noremap表示不做递归映射建议尽量用它设置 Leader 键是 Vim 社区最流行的模式。默认 Leader 是\很多人改成,或空格let mapleader, nnoremap Leaderw :wCR nnoremap Leaderq :qCR nnoremap Leaderf :FilesCR设定后按,后紧接着按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 Leaderwverbose会显示这个映射定义在哪个文件哪一行排查插件冲突非常有用。如果你想查终端层面的按键占用比如某个终端把Ctrls割占了就需要脱离 Vim 去看终端设置。一个靠谱的排查方法是先确认这个按键在 Vim 里是否被映射再确认是否被终端模拟器拦截最后确认是否被系统全局快捷键接管。无忧无虑的做法是换个终端环境测一下比如从 gnome-terminal 切到 tmux 里测就能缩小范围。桌面环境下的全局快捷键用系统工具查比如 Linux 上可以用xev查看按键事件Windows 上可以用第三方工具查看注册表里的快捷键占用。这类问题一般跟 Vim 没有直接关系而是系统层面抢键。7.2 挂起、冻结与缓存文件的急救速查最常见的是Ctrls把终端冻结了。这个错误基本是肌肉记忆害的在普通编辑器里Ctrls是保存在终端里按下去却会向终端发送 XOFF 控制字符Vim 画面不滚动看起来像卡死了。解决方法是按Ctrlq解冻。这个坑我至少教过两次新人几乎每个第一次在终端里用 Vim 的人都会中招。问题是很多桌面环境的终端还支持自定义映射建议把Ctrls的终端映射改掉或者禁用避免心态爆炸。Ctrlz会把 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 某个命令可以查看内置文档那里面的内容永远比我这种第三方总结更权威碰到不确定的细节第一反应养成查帮助的习惯比收藏任何文章都实在。
返回列表