1. 为什么Linux用户绕不开vim很多人第一次接触Linux时第一个绕不开的小工具就是vim。不管你是刚装好一台云服务器准备改Nginx配置还是接手一个老项目的代码总会在某个时刻突然发现自己面前只有一个黑底白字的终端而系统里的编辑器要么没装要么只有vi/vim可用。这时候会不会用vim直接决定你是能痛痛快快完成改动还是当场卡在“怎么退出”这个世纪难题上。我经常拿vim和命令行本身做类比Shell是你不开图形界面时和Linux打交道的主入口vim则是你在终端里和文本内容打交道的主入口。Linux常用命令大全里你可以不记得某个冷门工具的用法但vim几乎每天都要碰。尤其是运维、后端、嵌入式这些岗位跳进一个没有图形界面的服务器环境vim就是唯一的编辑工具。就算你平时主力用VSCode或者JetBrains全家桶遇到线上问题需要改个配置文件还是得老老实实打开vim。这也就解释了为什么Linux面试题里总会出现vim相关的问题模式切换、跳转、替换、查找、保存退出面试官问这些并不是为了刁难你而是想确认你是不是真的在Linux环境下干过活。你没用过vim很多线上操作只会显得手足无措。这篇文章我想把vim作为一个完整的文本操作体系来聊不只是罗列命令而是把它背后的设计逻辑、常用操作、配置技巧和踩坑经验一次讲清楚。1.1 vim到底是一个什么样的工具vim是Vi Improved的缩写也就是vi编辑器的增强版。vi在几十年前就随着Unix系统存在几乎是所有类Unix系统的标配。vim在vi的基础上加了语法高亮、多级撤销、分屏、插件生态、可视模式等能力但核心交互依然保留了vi的设计你不需要鼠标所有操作都在键盘上完成而且绝大多数时间光标不需要离开主键盘区。vim还有一个很有意思的身份自由软件基金会认证的慈善软件。作者Bram Moolenaar鼓励用户把部分收入捐赠给乌干达的慈善项目所以你在vim里输入:help uganda可以看到相关信息。这个背景听起来和“编辑器”没什么关系但能让你感受到vim社区的纯粹气质——它是一代工程师不依赖商业驱动做出来的工具设计逻辑非常自洽。用今天的眼光看vim不只是一个编辑器更像一套“文本操作语言”。普通编辑器解决的是“怎么把字打进去”vim解决的是“怎么高效地移动、选取、修改、批量化地处理文本”。这也是为什么很多程序员用了几十年vim仍然乐此不疲因为在熟练的人手里编辑文本就像弹琴手指几乎不离键盘思路可以一直保持在内容本身。1.2 vim的设计哲学模式编辑要理解vim必须先理解“模式模式编辑”这个反直觉的设计。普通编辑器比如记事本只有一个输入模式你按下字母键字母就出现在光标位置。vim不一样它默认处于普通模式Normal Mode在这个模式里你按下的几乎所有按键都不是输入字符而是发出指令。打个比方普通编辑器像手写字握笔即写但改错字得用橡皮擦vim则像弹钢琴同一个键在不同状态模式下发出的“声音”不一样。你按下j屏幕上不会出现字母j而是光标向下移动一行按下dd不会出现两个d而是删除当前行。只有当你主动进入插入模式a、b、c这类键才会变成真正的字符输入。这个设计刚用的时候确实难受。很多人第一次打开vim闷头输入文字结果屏幕上啥都没变化只会闪个光标然后迷茫地按CtrlC、CtrlZ甚至直接关掉窗口。但熬过最初的适应期你就会发现把“移动”和“输入”分离最大的好处是你不需要频繁地按方向键、翻页键、鼠标也不需要组合键去配合功能键。所有高频操作都在主键区手可以稳稳地放在键盘上效率自然就上来了。除了普通模式和插入模式vim还有命令行模式、可视模式。命令行模式用来执行保存、退出、替换、搜索这类“给编辑器下达整体指令”的操作可视模式用来以字符、行或者块为单位选中文本方便批量操作。后面我会逐个拆解你现在只需要建立一个整体认知vim不是“不能像普通编辑器那样用”而是“它希望你用一套更高效的方式去编辑”。1.3 哪些人适合认真学vim以及为什么要学我见过三四种典型的学习者第一种是运维工程师他们的工作场景全是SSH终端vim几乎是吃饭的家伙这一批人没有退路必须学会。第二种是后端和C/C开发者需要经常读Linux内核代码、改配置、写脚本vim的跳转和搜索能力对阅读大型代码非常有帮助。第三种是学生准备Linux面试题的时候发现十个里有三个在问vim出于应试目的不得不学。第四种是桌面端用户听说vim是编辑器之王想试试但又不知道该从哪里下手。不管你是哪一类我都建议你把vim当成一项“越用越值钱”的技能来学而不是背几道面试题就完事。理由很简单vim是跨平台的。Linux服务器上有vimmacOS自带viWindows上也可以装gvim或者通过WSL使用。你在任何一台机器上登录进去不需要安装任何额外软件vim就静静躺在那里。这意味着你投资的每一分钟学习时间都会在未来的无数个终端会话里反复兑现。当然我也不主张人人都把vim作为唯一的编辑器。现代IDE的代码补全、重构、图形化调试确实很强大vim在复杂大型项目里也不一定更适合作为主力IDE使用。但“会vim”和“只用vim”是两码事前者是基本功后者是个人偏好。我见过一位资深工程师平时在IDE里写代码一到改服务器配置、处理日志文件立刻切到vim双手如飞。这种切换能力就是vim给你的额外自由度。2. 从启动到第一次保存退出很多教程一上来就塞给你一串命令实际上新手最需要的不是命令大全而是走通一条完整的“打开文件→输入内容→保存退出”闭环。只要能顺畅地走完这个过程你就已经打败了80%的“被vim卡死”的人。2.1 安装vim的几种方式先看你的系统里到底有没有vim。在终端里输入vim --version如果能正常输出版本信息说明已经装好了。如果提示command not found就需要安装。基于Debian/Ubuntu的系统用sudo apt update sudo apt install vim基于Red Hat系CentOS/Rocky Linux/Fedora的系统用sudo dnf install vim-enhancedmacOS用户可以brew install vim这里要特别提醒一个经典报错在Debian或Ubuntu上执行sudo apt install vim时有时会看到一句很长的提示大意是“Package vim is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source”。这句话翻译过来就是系统告诉你当前软件源里找不到可以安装的vim包。第一次遇到的人会非常慌以为是系统坏了。其实最常见的解决办法就是先执行sudo apt update把软件源索引刷新一遍再安装。如果还是不认就要检查软件源配置里有没有包含universe组件因为vim在Ubuntu官方仓库里属于universe部分旧版默认源里可能没有开启。可以用apt-cache policy vim看一下系统到底识别到了什么版本也可以用sudo apt search vim看看相关包有哪些。实在急用的话sudo apt install vim-tiny也能先顶一下那就是一个功能精简的vim应急编辑足够但体验会差一些。2.2 第一次启动vim别急着打字装好之后在终端输入vim你会进入一个空白缓冲区。屏幕左侧或者底部可能有一堆波浪线~表示这些行是空的。这时候如果你直接敲键盘大概率会愣住输入的字符没有出现在屏幕上反而光标又跳又动。这就是vim的普通模式。我先不让你立刻按i而是建议你花十秒钟感受一下这个界面左下角如果显示“普通模式”类似的信息取决于版本和配置说明你处于指令状态。这时候按下j、k、l、h光标会分别在向下、向上、右、左移动按下x会删除光标所在位置的字符。先随便按一按建立起“普通模式下按键都是指令”的肌肉记忆。等你愿意正经输入了按下小写字母i进入插入模式左下角通常会出现“插入模式”的提示这时再敲键盘字符就会老老实实出现在屏幕上。输入一行字比如hello vim然后按下Esc键回到普通模式。到这里你已经完成了第一次vim之旅最难的心理跨越你明白了“先按i才能打字”这个核心规则。2.3 三种模式与模式切换理解了“普通模式和插入模式”之后再补充两个模式你的vim地图就完整了。严格来说vim有四类常见状态普通模式、插入模式、命令行模式、可视模式。普通模式是默认状态也是所有操作的起点插入模式只管输入文字命令行模式通过按冒号进入用来执行:w、:q、:%s这类命令可视模式通过v、V、CtrlV进入用来选中文本块。下面这张表是最基本的模式切换方式目的按键从普通模式进入插入模式在光标前插入i从普通模式进入插入模式在光标后插入a从普通模式进入插入模式在当前行下方新建行o从插入模式或可视模式回到普通模式Esc从普通模式进入命令行模式:从普通模式进入可视模式字符选中v从普通模式进入可视模式行选中V从普通模式进入可视模式块选中CtrlV新手最容易犯的错误是“到处乱按Esc”还不够再按CtrlC这没问题CtrlC也能中断当前操作并回到普通模式。还有一个很多人不知道的快捷键是Ctrl[它和Esc功能一样好处是手指不用伸到键盘左上角那么远。建议你从第一天开始就用Ctrl[代替Esc长期下来手会舒服很多。2.4 保存、退出与文件处理的基础操作保存和退出这组操作是新手最关心的也是面试里最高频的考点。先记最基础的四个命令作用:w保存文件:q退出vim:wq保存并退出:q!不保存强制退出还有一个:x它和:wq很像但只在文件有改动时才写入磁盘。如果文件没有变化:x不会动磁盘这对大量操作文件时减少无谓写入有帮助。普通模式下按ZZ等于保存并退出按ZQ等于不保存退出不过这两个组合键在日常使用频率不如命令行命令高知道存在即可。如果打开了一个文件输入内容之后不想保存就退出vim会拦截你提示文件有改动。这时候就需要:q!来强制离开但请谨慎使用所有未保存内容都会丢失。除了保存退出还有一些常用文件操作:e 文件名可以切换当前缓冲区到另一个文件:r 文件名可以把另一个文件的内容插入到光标所在位置:saveas 新文件名可以把当前文件另存为。前面这几个学会了你的vim已经不是“会打开”的程度而是“能完成一次正经编辑任务”了。3. 光标移动快得起来才是真本事如果只记一组vim操作我会让你先把光标移动练熟。因为vim所有的高效都建立在“以最快速度把光标放到该去的地方”这个基础上。如果你移动光标还靠方向键后面的一切效率都无从谈起。3.1 基础移动h、j、k、lvim在普通模式下用h、j、k、l四个键代替上下左右方向键h向左j向下k向上l向右。为什么这样设计因为vi诞生时的键盘不一定有独立方向键区更重要的是这四个键就落在标准指法的右下方食指和中指不用离开主键盘区就能操作。你想想写代码的时候手放在字母区如果每移动一步都要把右手挪到方向键上再挪回来一天下来不知道要浪费多少时间。刚开始用h、j、k、l会有点别扭因为你习惯了“方向键在那边”的直觉。但这是值得刻意练习的。一个简单的练习方法随便打开一个文本文件在普通模式下用j和k一行一行地移动用h和l一个字符一个字符地移动坚持五分钟你的手指就会开始记住。在h、j、k、l前面还可以加数字前缀比如5j就是向下移动五行10h就是向左移动十个字符。这个“数字命令”的组合规则在vim里非常通用几乎绝大多数命令都可以在前面加数字表示重复执行。这是vim效率的一个重要来源你不要按十次j而是直接告诉它“往下十行”。3.2 按词、按行、按屏移动光用基础移动滚动大文件还是太慢vim还提供了一组“弹性跳”能力。按词移动w跳到下一个单词开头b跳到上一个单词开头e跳到当前或下一个单词的末尾。这里要注意单词的边界规则连续的字母数字和下划线算一个单词其他符号比如点号、逗号、括号算一个单词这个规则在处理代码时非常好用。按行移动0跳到行首第一个字符^跳到行首第一个非空白字符$跳到行尾。它们之间的差别很微妙在缩进的代码里0会停在行首^会越过空格和制表符停在第一个代码字符上。写代码时我更常用^因为真正想操作的是代码内容而不是缩进空格。按屏移动CtrlF向下一页CtrlB向上一页CtrlD向下半屏CtrlU向上半屏。gg跳到文件第一行G跳到文件最后一行。如果你知道目标行号可以输入“行号gg”比如25gg就是跳到第25行也可以直接在命令行模式下输入:25回车。不同场景用不同方式比如看代码逻辑时用词移动浏览长文件时用翻页和gg/G找准目标行时用行号跳转。3.3 快速跳转到特定位置处理大文件时行号是绕不开的。先在vim里打开一个文件按下:set number打开行号显示每行前面就会出现数字。有了行号你可以用:行号精确跳转也可以用“行号gg”。如果你需要暂时记住某个位置再跳走可以用m字母打标记比如在光标处按ma然后在任意位置按a跳回这一行按a跳到该行的确切字符位置撇号加字母跳到行反引号加字母跳到字符。这个功能在阅读长代码时特别有用你想去另一个函数看一眼看完可以一键回到原来的位置。另外gg之后按CtrlG可以查看当前文件的总行数、当前行号、文件大小和百分比位置按G跳到文件末尾后再按CtrlG能看到整个文件规模。这个组合对于快速评估一个大日志文件非常有价值。3.4 搜索移动一把万能钥匙搜索移动是vim里最强效的定位方式。普通模式下按下斜杠/输入关键词回车光标就会跳到第一处匹配位置按n跳到下一处按N跳到上一处。比如你在一份配置文件里想找listen这个配置项直接/ listen回车然后一路按n就能快速检查每个出现点。还有个更快的技巧把光标停在一个单词上按星号会向下搜索当前光标所在单词按井号#会向上搜索当前光标所在单词。比如在代码里看到某个函数名想看看它被谁调用过把光标放在函数名上按然后一直按n逐一翻阅。这个动作几乎成了我在vim里看代码时的默认姿势。搜索后屏幕上的高亮会一直保留很多时候看完了不想再被高亮干扰可以输入:nohlsearch取消高亮。或者更优雅一点在配置里加上搜索增量高亮:set incsearch一边输入一边高亮预览能更快定位关键词。4. 编辑操作改、删、复制、粘贴移动只是准备真正的编辑动作才是vim魅力的集中体现。删除、复制、粘贴、修改这些技能叠加起来就是一个“文本操作忍者”的基本功。这里我不光讲按键还要讲vim对“动词宾语”这个语法规则的设计理解了这个后面学什么命令都很快。4.1 删除与修改的本质先理解操作语法vim的编辑命令有点像一个简单的句子动词范围。动词常见的有ddelete删除、cchange修改、yyank复制范围可以是w单词、l字符、行、句子、段落甚至是一个括号里的内容。把它们组合起来就是dw删除一个单词dd删除当前整行5dd删除从当前行开始往下的五行d$删除从光标到行尾d0删除从行首到光标前。x键删除光标所在字符这相当于dl的简化。r键可以替换当前字符比如把光标下的a换成b按rb。这些命令的差异在于x是一个“动词一个字符”的快捷写法c是“删除并进入插入模式”的快捷写法。这里要重点说一下change和delete的区别。d删除后你依然停留在普通模式文本少了光标位置变了c修改则更贴近实际需求删除一段内容然后直接进入插入模式让你马上输入新内容。比如ce修改到单词末尾change to end of wordcc修改整行C修改到行尾。为什么说它更高效因为大多数情况下你删完就是要重写如果用d删除还得再按一下i才能开始输入多了一步。vim的设计者把这两个场景拆开让高频场景少按一次键这就是它“抠效率”的典型体现。4.2 复制、剪切、粘贴与寄存器复制、剪切、粘贴在vim里分别是y、d、p。yank是复制dd是剪切p是在光标后粘贴P是在光标前粘贴。yy复制整行y$复制到行尾y^复制到行首。这组命令遵循上面说的“动词范围”规则所以理解规则后基本不用背。但vim的粘贴并不是只有一块剪贴板。它有寄存器register体系你可以把不同的内容存到不同的“格子”里。最常见的无名寄存器任何复制或删除的内容都会进去。具名寄存器a到z需要手动指定操作方式是在命令中间加引号加字母例如ayy就是把当前整行复制到寄存器a中然后按ap把寄存器a的内容粘贴出来。还有一个系统剪贴板寄存器可以把vim的内容复制到系统剪贴板也可以从系统剪贴板粘贴内容进来。和外部程序交换内容时你大概率会用到yy、p这两个操作。但要注意这个功能需要vim编译时带上了clipboard支持。检查方法是在终端执行vim --version看输出里有没有clipboard和xterm_clipboard如果显示的是-clipboard说明当前vim不支持系统剪贴板这种情况在精简安装的Linux系统上常见。没有剪贴板支持时你有两个选择换一个带图形支持的vim包或者用标准输入输出做中转比如用cat读取文件内容再粘贴但这不是日常首选。4.3 可视化模式与列块操作v进入字符可视模式V进入行可视模式CtrlV进入块可视模式。块可视模式是vim的杀手级功能它能选中一个矩形区域而不是连续的字符流。对于多行有规律内容的修改块操作效率高得惊人。举一个每批代码注释都会遇到的例子给连续十行代码的行首统一加上井号#。传统方法是什么一行一行地在开头敲#又慢又容易漏。用块可视模式怎么做把光标移到第一行行首按下CtrlV进入块模式然后按10j选中下面十行的同一列位置此时你会看到一块高亮区域。接着按大写的I开始插入注意这里一定是大写I不是小写i输入#再按Esc这十行开头就全部变成了#。原理是在块模式下插入的文本会按列复制到每一选中行。类似操作还有批量删除每行的前几列CtrlV选中区域后直接按d该矩形区域就会被删除。比如你要去掉多行数据开头的序号“1. ”、“2. ”这样的内容用块选择删掉头三个字符非常方便。这个功能在处理表格文本、代码对齐、批量加前缀后缀时是真正的效率神器。4.4 文本对象面向结构而非面向字符文本对象是vim高阶用法中非常值得学的一块。所谓文本对象是按语法结构来定位内容而不是按字符数。常见的有iw表示“光标所在的单词”i(表示“括号里的内容”a(表示“包含括号在内的内容”i表示“双引号里的内容”it表示“标签里的内容”。为什么要学文本对象因为很多时候你并不想从行首复制到行尾你只想要“一对引号里的内容”或者“一个括号里的参数部分”。比如代码里有这么一句String name getUserNameById(10086);你想改10086这个参数把光标停在这行任意位置按下ci(意思就是“修改括号里的内容”vim会直接选中10086并进入插入模式你输入新内容即可。再比如你想修改双引号里的字符串用ci就能一步到位不管字符串有多长、光标停在哪。文本对象里最常用的几个组合是ciw修改当前单词ci修改双引号内内容ci(或ci)修改括号内内容diw删除当前单词daw删除包含周围空格的单词yit复制标签内内容。一旦你习惯了这组操作你就不再想着“删一个字符再删一个字符”而是直接把整个结构拿下来这种思维方式才是vim真正的高效所在。5. 查找替换与全局操作vim里的替换命令是%s/old/new/g这几乎是所有Linux面试题里必考的一条命令。它看起来简单但展开讲有非常多的细节和陷阱比如范围、全局标志、确认机制、正则语法。掌握了它你在终端里做批量文本处理的能力会大幅提升。5.1 替换命令的基本结构替换命令的基本格式是“范围 s/旧内容/新内容/标志”。先看最常见的:%s/foo/bar/g它的含义是在全文范围%表示所有行内把每一处foo替换成barg标志表示替换每一行中的所有匹配而不是只替换每行第一个。如果没有范围替换只作用在当前行。指定范围可以是一个行号区间比如:10,20s/foo/bar/g表示只在第10行到第20行之间替换也可以是一个模式比如:.,$s/foo/bar/g表示从当前行到文件末尾。这里的常用符号有.表示当前行$表示最后一行的行号位置,3表示当前行到往后第3行。我实际处理日志时最喜欢用的是:.,$s/这个形式它可以不改变光标位置直接处理当前光标以后的整个文件内容。关于标志位最关键的是g。如果没有gvim只替换每一行第一次出现的匹配。比如一行里有三个foo你运行:%s/foo/bar这一行只会把第一个foo变成bar后面两个不动。这个坑我见过太多人踩了。另外一个很有用的标志是c表示替换前逐个确认。运行:%s/foo/bar/gc后vim会逐个高亮匹配位置询问你是替换y、跳过n、全部替换a、退出q还是按q退出、按l最后一个。当你不确定匹配范围是否准确时带上c标志是最稳妥的不会被误伤。5.2 几个高频替换场景实际工作里除了简单替换还有很多特殊场景。最常见的是处理路径分隔符。在vim替换命令中/本身就是分隔符如果旧内容或新内容里含有斜杠直接写会很混乱。比如要把所有/usr/bin改成/opt/bin不能写成:%s//usr/bin//opt/bin/g这会让vim分不清哪个是分隔符。解决办法是换一个分隔符比如用#、、都可以:%s#/usr/bin#/opt/bin#g。本质上vim允许你用任意非字母数字字符作为分隔符只要前后保持一致。这个技巧在处理URL、路径、正则表达式时非常重要。再比如清理行尾空格。很多代码规范不允许行尾有空白字符当你接手一份乱七八糟的文件时可以运行:%s/\s$//表示把每个匹配到的“一个或多个空白字符直到行尾”全部替换为空也就是删除行尾所有空格。还有一个场景是从Windows拷贝来的文本经常带回车符\r用:%s/\r//一次性清除。这些操作在日志整理和代码清理里几乎是日常工作。需要注意的是\s是一种正则写法你不需要成为正则大师但至少要知道\s表示空白字符表示一个或多个$表示行尾。5.3 全局命令:g的妙用替换命令里的搜索模式本身也是一个强大的“筛选器”。:g/pattern/command表示“对所有匹配pattern的行执行某个命令”。这样就把替换操作从“单点修改”扩展成了“按行批处理”。举个例子一份配置文件里有很多被注释掉的行开头是#你现在需要把所有注释行删除。可以运行:g/^#/d意思是删除所有以#开头的行。再来一个场景日志文件里有ERROR和DEBUG两种级别只想保留包含ERROR的行那可以反着写:v/ERROR/d。这里的v是全局命令的反向形式含义是“对所有不匹配的行执行命令”。:g/^#/d和:v/ERROR/d配合起来就是一个非常趁手的日志清洗方案。:g还可以配合复制命令使用。比如想把所有包含foo的行复制到寄存器a中以便后续统一粘贴可以运行:g/foo/y A注意这里大写A表示追加到寄存器a而不是覆盖。这个技巧在处理一批分散的匹配内容时很好用相当于先快速收集再统一输出。对于刚接触的人来说:g/pattern/d是最容易上手的建议先从这个练起很快你就能感受到“一条命令处理一行文件”的痛快。6. 多文件、窗口与标签页协作当你在vim里把单个文件的编辑玩得差不多了就会开始遇到“同时看多个文件”的需求比如对照两个配置、把一个函数从旧文件搬到新文件。vim为此设计了缓冲区、分屏和标签页三层机制。很多人到这一步会一头雾水因为这三者看起来差不多实际其实是为不同场景设计的。6.1 buffer缓冲区与文件列表缓冲区buffer是vim在内存中维护的文件副本。你用:e 文件名打开一个新文件时当前缓冲区切换了但第一个文件并没有被关闭它仍然作为一个缓冲区留在vim里。可以用:ls查看当前所有缓冲区列表列表里每个缓冲区有一个编号用:b编号切换到指定缓冲区比如:b2切到编号为2的缓冲区。缓冲区设计有一个好处你可以在一个vim进程里打开很多文件来回切换而不用反复退出进入。这比“每次只编辑一个文件”顺畅得多。如果想关闭某个缓冲区但不想退出vim可以用:bdelete 编号。这里要区分:q和:bdelete:q是退出vim如果还有其他缓冲区有未保存改动vim会提示是否保存:bdelete是只把某个缓冲区从内存里移除。我有段时间总是搞混以为:q会只关闭当前文件结果整个vim都退出了白做了一部分操作。除了:e也可以用:Explore打开vim内置的文件目录浏览界面按回车进入目录按-返回上级目录。虽然它看起来很朴素但在没有图形界面的服务器上已经很有用了。如果你不喜欢内置的netrw也可以后面通过插件换成更漂亮的文件树。6.2 分屏窗口同时看两个文件分屏是“同一时刻显示多个文件”的方案。:sp或者:split横向分屏:vsp或者:vsplit纵向分屏。分屏之后每个窗口显示一个不同的缓冲区内容。切换窗口的基本操作是CtrlW然后按方向键比如CtrlW加j把光标移到下方窗口CtrlW加h移到左方窗口。也可以CtrlW加w在窗口间轮流切换。分屏在哪些场景下最实用我个人最常用的两个一是读长文件时一个窗口在文件头部看结构定义一个窗口去文件中部或尾部看实现二是复制粘贴时源文件一个窗口目标文件另一个窗口用yy和p直接跨窗口传递内容。还可以用:set scrollbind让两个窗口同步滚动这个功能在逐行对照两个配置文件时特别好用。操作上关闭当前窗口用:q它只会关闭当前光标所在窗口不会连带退出vim。调整窗口大小可以用CtrlW加和-来增减高度用CtrlW加和来增减宽度。分屏窗口布局乱了也不用慌CtrlW加可以把所有窗口重新设为相同大小。如果你用vim -o file1 file2命令行启动vim会自动横向分屏打开这两个文件用vim -O file1 file2则是纵向分屏。6.3 标签页不是浏览器标签标签页tab在vim里更像一个独立的工作区每个tab里可以有多个分屏窗口。你可以用:tabnew 文件名新建一个标签页用gt和gT在标签页之间切换用:tabclose关闭当前标签页。这个机制的本质是把“一组窗口”保存为一个整体。新手容易把tab当成“打开多个文件的标签”然后装十几个tab结果切换起来依旧麻烦。我更推荐的思路是日常浏览多个文件用缓冲区b切换就足够两个文件反复对照用分屏只有在需要维护“多个编辑上下文”时才使用标签页比如一边处理配置文件一边处理日志一边跑测试脚本每个上下文放一个标签页。这样结构清晰不会一看到界面就头晕。一句话总结缓冲区管文件分屏管视图标签页管工作区。7. 配置文件与插件生态学到这里vim的基本操作已经算入门了。但vim和普通编辑器还有一个明显区别它可以被深度配置成完全属于你自己的编辑器。很多人花了大量时间折腾vim配置和插件这个过程本身也很有意思因为每一次优化背后都是“我想用得更顺手”的真实需求。7.1 .vimrc从零开始的最小配置vim的配置文件通常放在用户目录下的~/.vimrc。你第一次打开这个文件时它通常是空的或者不存在vim会用一套默认配置运行。默认配置很朴素没有行号缩进宽度可能是8语法高亮也不一定开用起来感觉像上个世纪的软件。配置vim的第一步不是去网上抄一份上千行的配置而是自己从最小可用配置开始理解每一行的含义。我建议第一份.vimrc至少包含这些内容set number set relativenumber set tabstop4 set shiftwidth4 set expandtab syntax on set hlsearch set incsearch set mousea set ruler逐行解释一下set number显示行号set relativenumber开启相对行号它会在当前行显示实际行号在上下行显示相对距离和数字命令配合极其高效tabstop和shiftwidth把Tab宽度和缩进宽度都设为4expandtab表示输入Tab时自动转换成空格这符合多数现代代码规范syntax on开启语法高亮hlsearch让搜索结果高亮incsearch让搜索时边输入边预览mousea允许鼠标操作虽然vim强调键盘但在某些场景下用鼠标点击定位也挺方便set ruler在底部显示光标坐标对定位当前行有帮助。你不需要一次全理解可以先照抄这份保存并重启vim感受一下这些配置带来的变化。最大的区别是一行行号终于有了、语法不再是一片黑白、搜索也不会一闪而过。有了正向反馈之后再慢慢追加其他配置。7.2 常用配置选项编码、备份、交换文件除了界面和缩进还有几个和“文件安全”相关的配置值得认真对待。很多人第一次看到“E45: readonly option is set”或“Swap file already exists”时会慌其实这些和vim的文件机制有关。vim在编辑文件时默认会创建一个交换文件swap file,文件正常退出后自动删除。如果vim异常崩溃这个交换文件会残留下次打开原文件时vim就会警告你。处理方式有两种按q退出编辑先确认是否有其他vim进程正在编辑同一个文件如果确认没有按d删除残留的交换文件再继续。如果你经常在服务器上编辑被其他进程占用或权限受限的文件可以在.vimrc里做一些调整。比如set backup set backupext.bak set confirm set hidden set autowritebackup和backupext让vim在保存时生成一个.bak备份文件出问题可以回滚。confirm让vim在退出时用交互确认替代报错而不是冰冷地拒绝。hidden允许缓冲区里有未保存改动时也切换到其他缓冲区不会强制你立刻保存。autowrite则是在切换缓冲区、编译、运行外部命令前自动保存当前文件。但要注意服务器的安全策略各不相同有些环境不允许随便生成备份文件你会更倾向于关掉它set nobackup set nowritebackup这一行配置在磁盘紧张的生产环境里很有意义。我的建议是个人开发机开着备份生产环境关掉备份只保留交换文件的警告机制。7.3 键位映射和leader键vim允许你把常用操作映射到更顺手的按键上。比如保存文件很多人的理想状态是“按一个leader键再按w”就能保存。vim里的leader键是一个前缀键默认是反斜杠\但位置不太好按更多人都把它设为空格键let mapleader nnoremap leaderw :wCR nnoremap leaderq :qCR nnoremap leaderh :nohlsearchCR这里nnoremap表示在普通模式下定义一个非递归映射 表示回车。映射后的效果是按空格再按wvim执行:w即保存文件按空格再按q执行:q退出按空格再按h取消搜索高亮。不用手伸到Esc旁边找反斜杠效率提升很明显。在定义映射时要理解noremap和map的区别。普通map允许键位映射连锁递归比如你先map a b再map b c那按a最终会触发c。noremap则禁止递归按键绑定就是最终绑定。大多数情况下用noremap系列更安全能避免映射冲突和奇怪的递归行为。常见的映射前缀有nnoremap普通模式、vnoremap可视模式、inoremap插入模式。插入模式的映射比较精贵因为会影响正常打字输入一般只建议把 这类功能键映射成特定操作比如切换粘贴模式。7.4 插件管理与现代vim的选择对于刚入门的人来说我反而建议不要一开始就陷入插件的大坑。vim本身的内置命令已经覆盖了绝大部分需求。但当你确有需要时插件能补上几项短板文件树、状态栏增强、模糊查找、代码补全。插件管理有很多方案旧派用Vundle新派多用vim-plug。vim-plug的安装方式很简单需要你先下载插件脚本curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim然后在.vimrc里声明插件call plug#begin(~/.vim/plugged) Plug preservim/nerdtree Plug vim-airline/vim-airline Plug junegunn/fzf, { do: { - fzf#install() } } Plug junegunn/fzf.vim call plug#end()保存退出后重新打开vim输入:PlugInstall即可安装。这里我举的几个插件是经典组合nerdtree提供文件树airline美化底部状态栏并显示模式、行列号、Git分支fzf提供快速模糊查找文件内容的能力。对于代码补全如果你用的vim版本较新可以考虑coc.nvim这类异步补全框架但它对配置和环境的要求更高完全可以等基础操作熟练后再折腾。另外很多年轻人现在直接投奔Neovim它和vim的操作逻辑几乎一致但内置了终端Lua配置更现代。如果你喜欢动手折腾Neovim是个很好的方向如果你追求稳定、依赖服务器上现成的环境经典vim依然是更普遍的选择。重要的不是编辑器本身多么花哨而是你能不能用最快的速度完成手头的编辑任务。一个装了二十个插件却连基本移动都不熟的人未必比得上一个只用默认美化的vim但操作行云流水的人。8. 宏录制与批处理操作vim真正让人上瘾的时刻往往是你发现“刚才那二十遍重复手工操作居然可以录一段宏让它自动跑完”的那一刻。宏macro就是把你的一串按键操作录下来之后一键回放非常适合处理有规律的重复文本操作。我把它放在比较靠后的位置是因为录制宏需要你对移动、编辑命令有一定基础否则你录出来的宏一点都不可复用。8.1 宏的录制、回放与基本原理宏的录制流程很简单普通模式下按q键再按一个寄存器字母比如avim开始录制把所有按键操作记录到寄存器a中按q停止录制。回放时按a执行一次按2a执行两次按则重复执行上一次的宏。具体看一个最典型的例子给连续若干行的每行末尾加上一个逗号。如果手动操作你要光标移到每行末尾输入逗号回车再移到下一行……重复很多次。用宏怎么做光标停留在第一行依次输入qa A,Escj q解释一下qa表示开始录制宏到寄存器aA表示在行尾进入插入模式输入逗号 回到普通模式j向下移动一行到下一行。q结束录制。此时按avim就会对当前光标所在行执行“行尾加逗号然后向下移动一行”。再按5a就对后面五行重复执行同样的操作。关键在于宏的结尾一定要把光标移动到“下一次操作应该开始的位置”否则宏重复执行时就会在同一行反复操作没有任何意义。8.2 宏的适用场景与实操示例宏最常见的场景是批量给内容加前缀或后缀、批量调整格式、批量把某一列的数据提取出来重组。比如你有一个原始数据文件每行格式是“姓名 年龄 城市”你想把它转换成SQL里的INSERT语句格式。手工写几十行显然不现实录一个宏就能秒搞定。假设第一行内容是张三 28 北京你想把它变成insert into user(name, age, city) values(张三, 28, 北京);。操作方法在第一行手工执行一次完整转换然后把光标停在这一行开头开始录宏。宏里的操作可以是这样在行首按i输入insert into...的开头部分Esc再通过w和e在单词之间移动手动插入引号、逗号、括号和分号。录制过程中遇到任何不确定的移动都要保证它是一条规则比如“向右移动一个单词”而不是“向右移动12个字符”。回放时只要每一行的字段数量、分隔方式一致宏就能一路跑完。这个过程很有成就感你会真切体会到“写了代码自动化处理文本”的快感。当然宏也有局限遇到不规则数据时容易出错最好先用少量行测试确认无误再批量应用。一般我会先录好宏按3a在几行上试运行打开撤销如果有问题按u完全撤销重新调整宏后再跑。8.3 录制宏的避坑经验录制宏最关键的避坑点是录制过程中不要使用U或u这种大范围撤销操作。你可能会觉得“我刚才按错了撤销一下不影响”但在宏录制里撤销命令本身也会被录进去而且回放时可能撤销掉前面正常的内容导致结果完全不可控。如果录制过程中发现错误建议直接q结束录制把错误的宏覆盖掉然后重新录一遍不要想着“回退一步再继续”。另外录制宏时要尽量避免绝对位置和固定行号。比如“跳到第10行”“向下移动15行”这类操作一旦被录进宏回放时就会跳到同一个绝对位置完全失去批量意义。宏里应该尽量使用相对移动j、k、w、e、0、$和文本对象ciw、di这类相对规则。开头移动光标到文件起始位置宏内部只管相对变化这样才能适应任意数量的行。最后提醒一次宏的录制和回放都要牢记“每轮操作结束时光标必须落在下一轮操作的起点”。这是宏能连续工作的核心。如果你录的宏在第一轮执行完但光标停在行尾第二轮回放时就会从行尾开始结果面目全非。每次录制完成先在两个行上手动验证确认光标位置和输出符合预期再去批量执行这样能省去大量返工。9. vim常见问题与排查速查表最后这部分我把我实际使用中遇到的和身边同事经常问的问题整理成了一份速查表。这些坑如果你提前知道能省下很多折腾的功夫。里面有安装类问题、使用类问题、安全类问题和面试常考点建议你在遇到时直接回来看这一章。9.1 “Package vim is not available”的完整处理这个报错在Debian/Ubuntu系系统上太有名了我单独拿出来讲。当你执行apt install vim时系统提示包不可用通常完整文本是“Package vim is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source”。出现这个问题的原因排在最前面的就是软件源索引太旧系统根本不知道该去哪里找vim。第一步永远先执行sudo apt update更新完成后重试sudo apt install vim大部分情况下问题直接解决。如果依旧报错第二步看你的软件源配置文件常见位置是/etc/apt/sources.list或者/etc/apt/sources.list.d/目录下的文件。Debian和Ubuntu的官方源是按组件组织的Ubuntu里有main、universe、restricted、multiverse四个组件vim对应在universe里。如果你的源里没有universe系统当然找不到vim。可以用apt-cache policy vim查看候选版本信息如果输出里没有任何候选版本说明当前源确实不包含vim。第三个排查方向是网络问题。软件源地址如果无法访问也会导致更新失败。此时可以先检查网络连通性再尝试切换一个可用的源地址。应急方案是安装sudo apt install vim-tinyvim-tiny虽然只有一个精简版功能但能让你先完成编辑任务后续再修复源的问题。记住一点报错信息里的“another package”常常暗示了这是一个源配置问题而不是软件本身被移除别被那句“obsoleted”吓住。9.2 模式卡住完全退出指南新手在vim里最崩溃的时刻就是“按什么都没反应”。其实你大概率只是停留在普通模式或命令行模式而不是插入模式。记住一条原则遇到任何异常先按Esc回到普通模式再按Ctrl[也行这两个都会把你带回普通状态。如果界面底部出现了冒号开头的内容说明你在命令行模式按Esc退出当前命令行而不是继续输入。如果文件是只读的你输入:w时会提示“E45: readonly option is set”。有两种处理办法确认这个文件确实需要被修改时用:wq!强制保存退出不需要保留这次修改时直接:q!离开。值得小心的是:wq!虽然有强制含义但它能不能真写入还取决于文件系统的权限如果文件所属用户不是你vim也无力回天得先确保你有修改权限。还有一个“卡死”场景是vim提示“Swap file already exists”。这是因为文件上次没有正常关闭留下了一个交换文件。此时屏幕会问你如何处理常见选项是O只读打开、D删除交换文件、Q退出、A中止。如果你确认没有其他vim进程在编辑该文件可以按D删除残留交换文件再正常打开如果搞不清楚状况先Q退出弄清后再处理。9.3 编码、粘贴乱缩进与其他高频坑中文内容乱码是很多新人的痛点。一般是在打开GBK编码的文件时vim默认按UTF-8解码。解决办法是在.vimrc里设置宽松的文件编码识别顺序set encodingutf-8 set fileencodingsutf-8,gbk,gb2312,gb18030,latin1这样vim会尝试按顺序解码文件遇到GBK内容也能正确显示。这里要提醒一点encoding和fileencodings是两回事encoding是vim内部使用的编码建议始终是utf-8fileencodings是打开文件时猜测编码的顺序配置好可以兼容各种编码文件。粘贴乱缩进是另一个高频坑。你把一段带缩进的代码从外部复制粘贴进vim结果每行前面都像被打了一拳一样乱跳这是因为vim开启了自动缩进而终端粘贴的文本被当成了逐字符输入触发了一连串的缩进计算。解决方法是先进入粘贴模式:set paste粘贴完再:set nopaste。更舒服的做法是在.vimrc里设置一个快捷键切换set pastetoggleF2以后需要粘贴时按F2vim底部显示“粘贴”粘贴完再按F2恢复。但这只对终端下的vim有效如果你在图形界面下使用vim更推荐用“p来粘贴它能绕过各种奇怪的重绘问题。文件被外部修改后vim会提示“File has been changed on disk”.这时用:e!重新加载磁盘上的最新内容。如果你希望vim自动感知外部改动可以在.vimrc里加上set autoread配合set autowrite编辑体验会顺滑很多。9.4 面试与日常工作实用速查最后给你一张我在Linux面试题和日常运维中都高频使用的速查表你可以截图或者抄到本子上但更建议你边看边在vim里试一遍需求命令显示行号:set number跳到第N行:N 或 Ngg跳文件头/文件尾gg / G删除当前行dd删除连续5行5dd复制当前行yy粘贴到光标后/前p / P全文替换foo为bar:%s/foo/bar/g当前行替换foo为bar:s/foo/bar/g搜索关键词/keyword取消搜索高亮:nohlsearch水平分屏/垂直分屏:sp / :vsp切换窗口CtrlW 方向键开始/结束宏录制qa ... q回放宏a强制不保存退出:q!保存并退出:wq这不仅仅是为了应付面试更是日常使用频率最高的操作集合。如果你能把这些命令做到“不加思考就按出来”你的vim水平已经超过了大多数人。根据我个人的经验vim学习最忌讳的就是“一次性背二十个命令然后扔在一边”。它真的像一门语言输入输出、条件判断都得在实际对话中练熟。我的建议是给自己安排一个“vim周”这周内所有配置文件的修改、日志的快速查看、代码里的小改动用vim完成不打开其他编辑器。一周后你会发现当初那些看似别扭的操作已经变成了本能。往后无论面试还是上服务器干活vim都不会再成为你的拦路虎。