1. 为什么这个时代你还需要认真学一次vim
1.1 编辑器与编译器:先搞清楚你手里的工具到底是什么
很多刚接触Linux的朋友,第一次听到“vim是编辑器,gcc是编译器”的时候,都会有点懵:这不都是处理代码的吗,有什么本质区别?我习惯用一句话解释:编辑器负责“写字”,编译器负责“把字变成机器能跑的东西”。你用vim打开一个C文件,在里面写printf("hello");,这个过程跟你在记事本里写下购物清单没有任何本质区别——都是在操作文本。真正把这段文字变成可执行文件,是编译器(比如gcc)的工作。
这个区分看起来简单,但特别重要,因为错误的认知会导致错误的期待。如果你把vim当成一个“写完代码自动帮你编译运行”的工具,那你打开vim的第一分钟就会失望。vim的目标很纯粹:最高效率地编辑文本。至于编译、运行、调试,那是终端里其他工具的事,vim只是提供一个入口——你完全可以不退出vim就执行shell命令、看编译结果,但那是“集成”的玩法,不是vim本身的功能。
1.2 vim到底能帮你解决什么问题
先说结论:vim解决的是**“手指不离开键盘、思路不被打断”**的文本编辑问题。你写代码的时候,最贵的资源不是键盘也不是屏幕,而是你的注意力。如果你的手每隔几秒就要从键盘挪到鼠标上去点一下、选中一段、再挪回来,你的思维流就被切断了。vim的设计目标就是让你用纯键盘完成所有操作:移动光标、选中、删除、复制、替换、跳转,全部不用碰鼠标。
这一点在服务器上表现得更极致。无论你是运维排查日志、改配置文件,还是管理远程服务器,你面对的都是一个没有图形界面的终端。这时候vim几乎是唯一的选择。你当然可以用nano,它确实更简单,但nano的功能上限太低了——处理大文件卡顿、没有强大的查找替换、没法录制宏。等你真的需要批量修改几百行配置的时候,nano会让你怀疑人生。
我再给你一个更接地气的场景:嵌入式开发。很多嵌入式工程师的日常工作流是:用vim改完代码,:wq退出,然后编译烧录。整个流程都不离开终端。如果你遇到一台老旧的服务器,或者一个没有桌面环境的系统,vim就是你最可靠的伙伴。它不挑机器、不挑网络、不挑环境,只要有一个终端,它就永远在那里等你。
1.3 谁需要认真学vim,谁可以不用学
说实话,vim的学习曲线确实有点陡,但这不代表所有人都需要啃完整个教程。我按实际情况给你分个类:
- 运维工程师、后端开发、嵌入式开发:必须学,这是饭碗技能。你迟早要面对没有图形界面的服务器,跑不掉。
- 日常写脚本、改配置的普通用户:学基础操作就够了。打开文件、移动光标、插入、保存退出,这五个操作能覆盖你90%的需求。
- 前端开发、客户端开发、数据科学家:可以学,但不必强求。如果你主力IDE用得很顺手,vim可以作为一种“远程应急技能”来掌握,了解基础操作,遇到服务器环境不至于抓瞎。
我很反感那种“不会vim就不配做程序员”的说法。工具是为人服务的,不是用来制造优越感的。但我也必须诚实地说:vim值得每个人至少认真学一次,因为它里面藏着很多关于“如何设计高效工具”的底层逻辑。哪怕你最后不用它,学习vim的过程也能让你重新思考自己每天都在用的编辑器到底好在哪里、差在哪里。
2. 打破“怎么退出vim”的魔咒:先搞懂模式化编辑
2.1 为什么新手都会卡在退出这一步
网络上关于vim最出名的段子就是:怎么退出vim?搜索出来的结果几千条。这个现象背后其实藏着一个核心概念——vim是模式化编辑器。什么意思?就是说,vim的同一个按键,在不同的“模式”下代表着完全不同的功能。普通文本编辑器永远是“输入模式”,你按键盘上什么键,屏幕上就打什么字。但vim不是这样的,它把“编辑文本”和“操作文本”分成了不同的状态,你在不同状态下按同一个键,结果完全不同。
新手第一次打开vim,默认处于normal模式(普通模式),这个模式下你按i、a、o都不是打字,而是“进入插入模式”的指令;按:是“进入命令行模式”的指令;按Esc是“回到普通模式”的指令。所以新手一进vim,看到个空屏幕,按hello,发现屏幕上什么都没出现——因为h是向左移动光标,e是跳到词尾,l是向右移动光标,o是新建一行。这就非常让人抓狂了。
理解了这个设计,你就明白“怎么退出vim”的答案了:先按Esc确保回到普通模式,然后输入:q回车退出;如果有未保存的修改,就输入:q!强制不保存退出;如果要保存并退出,输入:wq回车。这三个命令能解决你99%的退出需求。剩下的1%,比如ZZ(保存退出)和ZQ(不保存退出),也值得记住,但没必要一开始就背。
2.2 vim的核心模式:一张图理清它们的关系
不画图,我用文字帮你把vim最常用的三种模式串起来:
- 普通模式(Normal):这是vim的默认模式,也是“操作模式”。在这个模式下,你按下的键是命令:
j向下、k向上、x删除当前字符、dd删除整行,诸如此类。你在这个模式里待的时间越长,说明你操作越熟练。 - 插入模式(Insert):这就是真正“打字”的模式。按
i进入,按Esc退出。进入方式不止一种:i是在当前字符前插入,a是在当前字符后插入,o是新建一行并进入插入模式,A是跳到行尾并进入插入模式。这几种方式各有适用场景,后面细说。 - 命令行模式(Command-line):按
:进入,这个模式下可以输入命令,比如:w保存、:q退出、:s/foo/bar/g替换。输入完命令后按回车执行。 - 可视模式(Visual):按
v进入,这个模式下移动光标会选中文本,类似你用鼠标拖选。按V是按行选中,按Ctrl+v是按列块选中。这个模式在做多行操作时特别好用,后面专门讲。
你现在不用急着全记住,只要脑子里有个概念:vim的键盘可以复用,同一排按键在不同模式下干不同的事。这就是它能做到“手不离键盘”的根本原因——别的编辑器需要组合键解决的功能,vim靠模式切换来解决。
2.3 第一次实操:从打开文件到保存退出的完整流程
我来带你完整走一遍vim最基础的操作流程,你照着敲一遍,立刻就能上手。
第一步,在终端里创建一个测试文件:
vim test.txt如果你是用普通用户执行,vim会打开一个空文件;如果文件不存在,vim会新建它,你会在底部看到"test.txt" [New File]的提示。
第二步,现在你处于普通模式。按下键盘上的i键,注意观察底部状态栏出现了-- INSERT --。现在你可以正常输入文字了。随便打几行内容,比如:
hello vim this is a test第三步,按Esc键退出插入模式,回到普通模式。然后输入:wq并回车。:w是写入(保存),q是退出,合在一起就是保存并退出。回到终端后你用cat test.txt查看,会发现刚才输入的内容已经保存了。
这个流程虽然简单,但已经涵盖了vim最核心的链路:普通模式 -> 插入模式 -> 普通模式 -> 命令行模式 -> 退出。你只要把这条链路走顺了,vim就算入门了。剩下的所有操作,本质上都是在这条链路的各个环节中增加更高效的操作方式。
2.4 实操心得:模式切换的节奏感
学vim有个很微妙的感觉,可能很少有人跟你讲:什么时候该进入插入模式、什么时候该留在普通模式,是要有节奏感的。新手最常见的误区是:一进vim就按i进入插入模式,然后就一直处在插入模式里,想移动光标只能用方向键,想删除只能用退格键。这样用vim,体验跟记事本没什么区别,甚至更糟。
正确的节奏是:在普通模式下完成所有“动作”,只在真正要输入文字的时候才进入插入模式。比如你想在“hello”后面加一句“world”:最好的做法不是按方向键挪过去,而是先用普通模式的光标移动命令(比如w跳到词尾、e跳到词尾)把光标定位好,再按a进入插入模式追加内容。这样你的左手始终停留在键盘核心区域(尤其是j、k、l、h这排键),不需要去够方向键,效率会高很多。
3. 高频命令拆解:移动、编辑、查找与替换
3.1 光标移动:在文件里“跳”而不是“挪”
vim里的光标移动命令是效率的分水岭。普通编辑器里你挪光标的方式是方向键一格一格按,或者鼠标点。vim里的做法是“跳跃式”的。
基础移动(词级):
w:跳到下一个单词的开头e:跳到下一个单词的结尾b:跳到上一个单词的开头0:跳到行首$:跳到行尾
这四个命令加0和$,能覆盖你在行内和词间80%的移动需求。举个真实例子:你在int myVariable = 42;这行代码的末尾,想把这行的42改成100。普通编辑器的做法是把光标一路往左挪,或者鼠标点过去。vim的做法是:按b跳到42前面,按ciw(change inner word的缩写)把42这个单词整个删除并进入插入模式,直接输入100。整个过程手都不用离开键盘核心区域,速度是肉眼可见的快。
跳转级别:
gg:跳到文件第一行G:跳到文件最后一行:n:跳到第n行(比如:100就是跳到第100行)Ctrl+d:向下翻半屏Ctrl+u:向上翻半屏Ctrl+f:向下翻一屏Ctrl+b:向上翻一屏
这里我特别推荐Ctrl+d和Ctrl+u,翻半屏比全屏翻页的上下文保留感更好,你在阅读代码的过程中不容易“迷路”。
行内跳转:
^:跳到行首第一个非空字符g_:跳到行尾最后一个非空字符f加字符:跳到本行里下一个指定字符(比如fx跳到下一个x的位置)
你可能觉得这些命令太多了记不住。我的建议是:每周只刻意练两三个命令,练到变成肌肉记忆。比如这周我全程用w、b、e,不用方向键移词;下周加练0、$、^、g_。一个月下来,你的光标移动速度会颠覆你的认知。
3.2 编辑操作:删除、复制、粘贴与撤销
编辑操作是vim里最带感的部分。很多操作动词化的设计,让你可以像说一句话那样组合命令。
删除:
x:删除当前字符dd:删除当前整行dw:删除从光标到词尾d$:删除从光标到行尾d0:删除从光标到行首5dd:删除从当前行开始往下5行
注意d这个动词后面可以跟“动作范围”——d是delete,w是word,$是行尾,组合起来就是“删除到什么位置”。这个逻辑贯穿vim始终,非常非常重要。
复制与粘贴:
yy:复制当前行yw:复制从光标到词尾p:粘贴到光标后P:粘贴到光标前5yy:复制从当前行开始往下5行
你可能会问:vim里复制粘贴的选择怎么办?普通编辑器是“选中-复制-粘贴”,vim里的逻辑是“用命令直接指定要复制的内容”,不需要先选中。比如我想复制这行的第一个单词:光标移到行首(0),然后yw,就把第一个单词复制了。
撤销与重做:
u:撤销上一步操作Ctrl+r:重做(即撤销的撤销).:重复上一次修改操作(这个命令神了,后面专门讲)
有朋友会担心“vim有没有撤销的历史记录”,这里有。vim默认的撤销记录是线性的(每一步操作都记录),直到你配置了撤销文件(:set undofile),它甚至可以跨会话保留撤销历史——你关掉文件再打开,还能继续撤销。这是我建议每个vim用户都开启的配置,后面在配置章节会讲。
3.3 查找与替换:比肉眼搜索高效一百倍的方式
在长文件里找一个关键词,普通编辑器的做法是Ctrl+F搜索框。vim的做法更直接:在普通模式下按/,输入关键词回车,vim会高亮所有匹配项,然后按n跳转到下一个匹配、N跳转到上一个。全程不用碰鼠标,手指就在键盘核心区。
如果只想查找当前光标所在的单词,更快的做法是:按*直接向下搜索光标下的单词,按#向上搜索。在阅读代码时特别爽,你在一个函数名上按*,所有出现这个函数名的地方就都被高亮出来了。
替换操作是vim的绝活。普通编辑器的批量替换功能在vim里用:%s/旧文本/新文本/g实现。拆解一下:
%:表示整个文件范围s:substitute,替换旧文本:被替换的内容新文本:替换后的内容g:global,整行中所有匹配都替换,如果去掉g,每行只替换第一个匹配
如果只想替换当前行,去掉%,直接:s/foo/bar/g。如果只想替换第10行到第20行,写成:10,20s/foo/bar/g。还可以用c标志做确认替换::s/foo/bar/gc,vim会在每次替换前问你是否替换,输入y是确认、n是跳过、a是全部替换。
我实际工作中最高频的场景是:修改配置文件的IP地址。比如有个配置文件里有三处192.168.1.1要统一改成10.0.0.1,在vim里一条命令搞定:
:%s/192\.168\.1\.1/10.0.0.1/g注意IP里的点.在vim的正则里表示“任意字符”,所以需要用\.转义。这个坑我踩过好多次,提醒你一下。如果你的场景不需要正则,只想纯文本替换,可以在命令末尾加\?不对,正确的做法是在s后面加\V:
:%s/\V192.168.1.1/10.0.0.1/g\V表示“very nomagic”,强制所有字符都按字面意思解释,不需要转义。这个技巧能让你在做纯文本替换时少掉很多头发。
3.4 可视化模式与多行操作:一次搞定多行注释和缩进
在实际工作中,多行注释、多行加前缀、批量缩进这类需求非常常见。vim的可视化模式就是专门干这个的。
按行选中(V):在普通模式下按大写V,进入可视行模式,移动j、k上下选中多行。选中后:
- 按
d删除选中内容 - 按
y复制选中内容 - 按
>整体向右缩进 - 按
<整体向左缩进
这个操作在代码格式调整的时候极其好用。比如你写了一段代码发现整体多缩进了一级,进入V模式选中那几行,按<就整体退回来了。
按列块选中(Ctrl+v):这是很多人没get到的神器。在普通模式下按Ctrl+v,进入可视块模式,移动光标选定一个矩形区域。它的最强玩法是给多行加注释:
- 光标移到第一行注释符号要插入的位置
Ctrl+v进入块模式- 按
j向下选中所有需要注释的行 - 按
I(大写i)进入插入模式,输入注释符(比如//或#) - 按
Esc,神奇的事情发生了:所有被选中的行都在你指定的位置插入了注释符
取消注释也一样:在块模式下选中注释符区域,按x直接删除选中的列块。这个技巧在我处理配置文件、批量加注释调试代码的时候,效率提升不是一点点。
还有一个跟块模式搭配的命令::norm命令。比如你想给第1行到第10行行首都加上#注释,不用进块模式,直接输入:
:1,10 norm I#norm意思是“在这几行上执行普通模式命令”,I#就是“跳到行首并插入#符号”。这个命令可以批量执行任意普通模式操作,非常灵活。我经常用它来做批量替换前缀、批量删行尾空格之类的事情。
4. vim效率的终极秘密:组合命令与宏录制
4.1 动词加宾语:vim命令其实是一套语法
很多vim教程会教你背诵几十个命令,但真正的vim老手不会死记硬背,他们掌握的是一套语法规则。这套语法简单到令人发指:
动词(操作) + 宾语(操作对象)
动词有:
d:delete,删除c:change,修改(删除并进入插入模式)y:yank,复制v:visual,选中
宾语有:
w:word,一个单词s:sentence,一个句子p:paragraph,一个段落$:行尾g_:行尾非空字符t加字符:到某个字符之前
比如你要删除一个段落:dap(delete around paragraph),用这个命令,光标在段落里任意位置都可以一次删掉整个段落。你要修改整个句子:cis(change inner sentence),句子内容被清空并进入插入模式,直接输入新句子。
我第一次理解这个“动词+宾语”的设计时,脑子里响了一声——vim的命令不是死板的组合键,而是一种语法。学会了这套语法,你能自然组合出各种操作命令,不用再一个个查。比如你知道y是复制、t是“直到某个字符前”,那yt,的意思就是“复制从当前光标到这个逗号之前的全部内容”,一句话就表达清楚了,多酷。
4.2 数字参数与重复:一键搞定重复性操作
vim的命令前面可以加数字,表示“执行多少次”。这个设计很简单,但配合动词+宾语语法,能爆发出惊人的效率。
3dd:删除3行2w:向前跳2个单词5yy:复制5行3x:删除3个字符
更高级的玩法是配合.命令。.命令在vim里表示“重复上一次修改操作”。举个例子:你想给三个不同位置的单词加上引号。操作方法:在第一个单词处按ciw然后输入"word"(或者用viw选中后按S"),完成第一次修改。之后每次把光标移到下一个单词上,按.,vim就会自动重复“把当前单词替换成带引号的版本”。修改三个单词只需要按三次.键,效率完全是另一种体验。
宏录制是重复操作的终极方案。宏就是“录制一段操作,然后多次回放”。比如你拿到一个列表,需要把每行开头加上序号:
- 把光标定位到第一行行首
- 按
qa开始录制宏到寄存器a(q是录制命令,a是寄存器名字) - 按
I进入插入模式,输入1.,按Esc回到普通模式 - 按
j移动到下一行行首(假设是0开头的行) - 按
q结束录制 - 现在你需要对接下来N行执行宏,把光标移到下一行,按
@a回放刚才录制的宏
如果你的序号要递增,那还需要在宏里用到Ctrl+a递增数字的命令,这有点复杂,但思路是一样的:录制一次,回放无数次。我处理几百行的批量重复操作时,宏是绝对的主力,比手写脚本还省事。
4.3 实际案例:用组合命令整理一份杂乱日志
我把上面的知识串起来,给你一个实战案例。假设你拿到一份日志,每行开头有空格,你想统一去掉行首空格,并且把所有“ERROR”替换成“WARN”。在vim里:
全选所有行,去掉行首空格:
:%s/^\s\+//^\s\+的意思:行首^,一个或多个空白\s\+,替换成空。批量替换ERROR为WARN:
:%s/ERROR/WARN/g如果你想单独看一下每条WARN日志的上下文,按
/WARN搜索,然后按n逐个跳转。
这套操作在普通编辑器里需要:用正则批量替换两次。其实vim也就是两步。但如果你要做的更复杂——比如每行日志要截取某个字段、加上时间戳、去掉重复行——那就用宏或者norm命令。比如给每行前面加上日期前缀:
:%norm I2025-01-01%norm的意思是“在整个文件的每一行上执行普通模式命令”,I2025-01-01就是“跳到行首并插入这段文字”。一条命令,几百行全搞定。这就是vim组合命令的威力。
5. 把vim调教成顺手的样子:配置入门与常用插件
5.1 基础配置:.vimrc里值得立刻抄走的几行
vim的配置文件在用户主目录下,叫.vimrc。没有就自己建一个。配置文件的本质就是一堆vim命令,vim启动时自动执行它们。所以你在普通模式里能敲的命令,几乎都能写进配置里。
我建议你至少设置这几项:
" 显示行号 set number " 语法高亮 syntax on " 开启相对行号,配合number一起用特别爽 set relativenumber " 用空格代替Tab,避免在不同机器上显示错位 set expandtab set tabstop=4 set shiftwidth=4 " 搜索时实时高亮 set hlsearch set incsearch " 支持鼠标(如果你实在需要的话) set mouse=a " 自动缩进 set autoindent " 设置UTF-8编码 set encoding=utf-8 " 开启持久化撤销历史 set undofile set undodir=~/.vim/undodir其中set relativenumber这个配置你可能不熟,但它是vim老手最爱的设置之一:它会让你当前行显示绝对行号,其他行显示相对于当前行的行号。这样你想跳到“往下第7行”时,看行号直接7j,想删除“往上5行”时直接5dd,清清楚楚。
5.2 键位映射:把最常用的操作改成一次按键
如果你觉得vim的某些操作还是需要按太多键,可以在.vimrc里自定义键位映射。最经典的例子是把jj映射成Esc:
inoremap jj <Esc>这样在插入模式下,连续按jj就会退出插入模式,不用伸手去够远处的Esc键了。这个映射让很多新手对手速提升有极大帮助。另一个常见需求是把:映射到中文输入法下的全角冒号。在中文输入法状态下按:会输入全角冒号,vim不认。你可以加一行:
cnoremap : :这样在命令行模式下,中文全角冒号会被自动转成英文冒号,防止你切输入法切到崩溃。
还有一类映射你需要知道的是<leader>键。vim里<leader>是一个自定义前缀键,默认是\,很多人喜欢改成空格键:
let mapleader=" "然后你可以定义很多快捷操作。比如我习惯用<leader>w快速保存文件:
nnoremap <leader>w :w<CR>用<leader>q快速退出(不保存):
nnoremap <leader>q :q!<CR>这样手指在空格键周围就能完成大部分高频操作。键位映射是vim个性化的重要组成部分,但我不建议你一开始就配一堆复杂的映射——先用原生命令练熟了,自然知道哪些操作是你需要变成快捷键的,那时再来配置更有针对性。
5.3 插件:从朴素编辑器到轻量IDE的进化
vim本身是个朴素的编辑器,但装上插件以后,它的能力可以接近一个轻量IDE。插件管理器我推荐用vim-plug,安装方式简单,插件管理也清爽。
安装vim-plug:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim然后在.vimrc里声明插件。我个人最常用的几个插件:
nerdtree:文件树侧边栏,方便浏览文件结构ctrlp.vim或fzf.vim:模糊文件搜索,输入文件名部分字符就能快速定位文件vim-airline:底部状态栏美化,显示当前模式、行号列号、Git分支等vim-fugitive:Git集成,支持在vim里查看diff、提交、暂存coc.nvim:代码补全引擎,支持LSP,让vim拥有IDE级别的补全能力
配置示例:
call plug#begin('~/.vim/plugged') Plug 'preservim/nerdtree' Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' Plug 'vim-airline/vim-airline' Plug 'tpope/vim-fugitive' Plug 'neoclide/coc.nvim', {'branch': 'release'} call plug#end()保存后,在vim里执行:PlugInstall就会安装这些插件。装完以后,打开vim你会觉得它的战斗力提升了一个数量级——但这不意味着你必须装一堆插件才能用vim。我见过很多vim大神,他们的配置文件只有十几行,用的全是原生功能。插件是“按需增补”,不是“标配”。
5.4 值得收藏的vim内置功能:分屏与终端
很多人不知道vim自己就带分屏和终端功能,根本不需要打开好几个终端窗口。
分屏:
:split或:sp:上下分屏:vsplit或:vsp:左右分屏Ctrl+w加方向键:在分屏之间切换Ctrl+w加q:关闭当前分屏
分屏的好处是:你可以同时看两个文件的对比,或者一个文件的两个不同区域,极大方便了代码对比和文档参考。
内置终端:从vim 8.0开始,vim内置了一个终端模拟器,:terminal或:term就可以打开。这样你在vim里就能直接执行shell命令,比如编译、运行脚本,不需要退出vim。从vim的终端模式回到普通模式,按Ctrl+\加Ctrl+n;要退出终端,就正常执行exit。
这些内置功能让vim的“生态闭环”非常完整:编辑、查看、编译、运行,全在一个终端窗口里完成。
6. 常见问题与排查技巧实录
6.1 “按了Esc还是退出不了插入模式”
这个问题我在公司里被问过不止十次。真相通常是:你按的不是Esc键,而是数字键盘或功能键区的某个“Esc-like”键。有些笔记本的Esc键被设计在功能键区第一排,容易误按成F1或其他键。解决办法只有两个:一是确认你按的是真正的Esc,二是把某个顺手组合映射成Esc(前面说的inoremap jj <Esc>就是从根源上解决问题)。
另一个可能的原因是:你在中文输入法状态下按Esc。有些Linux发行版的输入法会在Esc退出插入模式时不放行,或者焦点被输入法接管。此刻你先切回英文输入法(通常是Shift键切换中英文),再按Esc。这里有个土办法:在vim里按Ctrl+[其实也等同于Esc,这个组合键不受输入法影响,可以作为备选方案。
6.2 用vim编辑文件时方向键变成了“ABCD”
这个现象非常经典。原因是:终端没有正确识别方向键的转义序列,或者vim处于普通模式而你按了方向键,终端发送了方向键的转义序列^[[A之类的,但vim没有正确解析。解决方法:
- 在
.vimrc里设置set term=builtin_ansi或干脆用set nocompatible。 - 更根本的做法:用
h、j、k、l来移动光标,不要用方向键。这既是vim高效使用的前提,也不会遇到方向键在各终端下兼容性问题。
6.3 从vim退出到终端后,终端快捷键失灵
这是很多人忽略的一个坑:你在vim里按了某些组合键,比如Ctrl+z暂时挂起vim,然后shell里可能残留了vim设置的一些终端模式(比如set mouse导致终端鼠标事件被接管)。最简单的解决方法是:在vim里正确退出(:q或:wq),不要用Ctrl+z挂起。如果已经挂起了,输入fg回到vim再正常退出。在.vimrc里加上:
set ttymouse=可以避免鼠标模式在退出时污染终端。
6.4 误删内容后怎么办
误删是新手在vim里最容易发生的事。记住三个救命键:
u:撤销最后一次修改Ctrl+r:重做,即撤销的撤销U:撤销当前行上所有修改(回到初始状态)
如果你已经退出了vim,但只要开启过set undofile,还能在下次打开时继续撤销。这个配置强烈建议开启。如果你因为误删而保存退出过,那就没法靠vim撤销了,但你可以用系统的文件备份工具——如果文件在Git仓库里,那就更简单了,git checkout就回来了。
6.5 vim常用命令速查表
| 操作 | 命令 | 说明 |
|---|---|---|
| 进入插入模式 | i/a/o | 光标前插入/光标后插入/新建一行插入 |
| 退出插入模式 | Esc或Ctrl+[ | 回到普通模式 |
| 保存 | :w | 写入文件 |
| 保存并退出 | :wq或ZZ | 保存后退出 |
| 不保存退出 | :q!或ZQ | 强制退出,丢弃修改 |
| 删除当前行 | dd | 删除光标所在行 |
| 复制当前行 | yy | 复制,粘贴用p |
| 撤销 | u | 撤销上一步 |
| 重做 | Ctrl+r | 重做上一步 |
| 查找 | /关键词 | 向下搜索 |
| 替换 | :%s/旧/新/g | 全局替换 |
| 跳转指定行 | :行号 | 如:100跳到100行 |
| 显示行号 | :set number | 开启行号显示 |
| 分屏 | :sp/:vsp | 上下/左右分屏 |
| 打开终端 | :terminal | 在vim内打开终端 |
这张表涵盖了你日常用vim的绝大部分操作,把它存下来,遇到想不起的随时回来查。
最后再分享一点我自己的体会
使用vim这些年,最大的感受不是“键盘飞起来了”那种炫技的快感,而是对“工具”这件事的理解变了。普通工具是“给你什么你就用什么”,但vim是一个“你可以把它塑造成你想要的样子”的工具。它的模式设计、命令语法、可配置性,让使用者真正成了工具的主人。
如果你刚接触vim,别急着背命令,也别因为一开始想“退出却退不出去”就否定它。我的建议是:用一个月的时间,强制自己所有编辑场景都用vim,哪怕慢一点、卡一点,也要坚持下去。一个月后你再回头看,那种手指在键盘上流畅移动、指令一个个精准执行的感觉,是任何图形界面编辑器都给不了你的。
如果实在坚持不下去,也不用有负罪感。工具是为人服务的,你习惯用哪个就用哪个。但至少,在服务器上、在远程终端里、在某个没有图形界面的深夜排障现场,你熟悉的那几个vim命令会成为你最可靠的后备方案。这大概就是vim带给从业者最朴素也最实用的安全感。