
说起来也怪在用过的所有文本编辑工具里骂得最多的是它用得最勤的也是它。这篇Linux个人心得第三篇本来想写点别的但每次打开终端、敲下vim的那一刻我就觉得还是得先把这玩意讲透。我眼中 vim 编辑器不只是“又一个编辑器”它是所有 Linux 管理员、后端开发者、运维工程师都绕不开的一道坎。你可以在图形界面里用任何顺手的东西写代码可一旦连上服务器、打开容器、改个 nginx 配置vim 就成了唯一确定存在的选择。这篇内容适合刚接触 Linux 但被 vi/vim 折磨过的新手也适合已经懂一点基础、想进一步优化操作习惯的朋友。我会按自己从“按退出都成问题”到“基本离不开”这条真实路线把模式、常用命令、配置、远程使用、日常踩坑完整梳理一遍尽量做到看完就能去终端里练一练。1. 为什么每个 Linux 用户都得过 vim 这一关1.1 先说点大实话第一次用 vim 谁都是崩溃的我记得特别清楚第一次在 Linux 上打开 vim是为了改一个配置文件。进入终端敲了vim /etc/xxx.conf界面打开了但我根本不知道此时处于什么状态。键盘一阵乱按屏幕上毫无反应光标也不能自由移动。我下意识去按方向键结果屏幕上冒出来[[[[这样的乱码。当时的第一反应是完了这编辑器是不是坏了。随后我试着输入“内容”发现有的输入进去了有的输入不进去有的按了之后直接把整行都删没了。最惨的是想退出试了exit、quit、bye全都没用。最后只能靠CtrlC疯狂中断实在不行直接断掉终端会话。这种体验我相信不是少数人经历过——第一次用 vim 的人九成都会想把它卸载了。但为什么 Linux 世界里依然到处都是 vim因为卸载不掉也卸载不了。所有主流 Linux 发行版、几乎所有带标准环境的 Unix 系统都默认内置了 vi/vim它和grep、awk、sed一样属于系统的底层组成部分。真正让人接受它的关键不在于逃避而在于搞明白“它本来就是这么设计的”。1.2 vim 解决的核心问题让手不离开键盘如果你用惯了 Windows 下的记事本或某个图形编辑器会习惯性地依赖鼠标去选择、点击、右键、复制、粘贴。而 vim 的整个设计前提就是用户应该在键盘上完成所有操作。所以它的操作逻辑和普通编辑器完全不同。普通编辑器是“打开就写”而 vim 是“打开先定位再按指令”。它把键盘操作分成了几个模式每个模式下相同的按键有不同的含义。正是这套被很多人吐槽“非人类”的模式换来了极高的编辑效率光标移动不用方向键摇杆半天大段删除不用鼠标拖选跨行复制粘贴不用反复右键。一旦肌肉记忆建立起来你的手可以一直放在键盘核心区域一秒都不用挪开。而且 vim 的普适性是真的强。你不需要网络不需要图形桌面不需要插件平台只要有终端、有键盘vim 就能干活。我后来维护的一台无桌面环境的服务器系统内存仅几百兆图形界面根本跑不起来但 vim 依然行得稳稳的。它在资源受限的场景里就是事实标准。1.3 学 vim 要经历的三个阶段以及一个常见误解以我带过的新人和自己走过的路来看学 vim 大体会经过三个阶段。第一阶段叫“被迫应付期”。这个阶段你只需要记住最少的生存命令i进入插入模式、Esc返回普通模式、:wq保存退出。这三个东西足够撑过前几次服务器配置修改。千万别在第一阶段就试图背几百条命令那会直接劝退。第二阶段叫“主动理解期”。你开始意识到普通模式下的按键不是摆设而是“操作指令”的组成单元。d是删除、w是词、p是粘贴组合起来可以得到dw删除一个词、dd删除一行。这时候才算真正碰到 vim 的门槛。第三阶段叫“肌肉记忆期”。这时候你已经不需要再想“我要按什么命令”手指直接会做出反应。打开文件、查阅、修改、保存、跳转一气呵成用 vim 改配置文件就像呼吸一样自然。一个我不吐不快的误解很多人觉得“用 vim 的人都是装”或者“vim 非得配一大堆花里胡哨的插件”。这两条我都反对。vim 骨子里是轻量、快速、可靠的它默认配置已经能完成绝大多数编辑任务插件只是锦上添花。真正的高手往往是“什么环境都能用 vim 干活”而不是“依赖一堆插件才能干活”。2. 核心操作拆解从打开文件到随手编辑2.1 先记住三件事文件、模式、退出使用 vim 的第一步就是把打开文件、切换模式、正常退出这三件事刻进脑子里。打开文件很简单vim filename。如果文件不存在vim 会新建一个待保存的空文件如果存在就用 vim 打开它。打开之后你处于普通模式Normal Mode。这是 vim 的默认模式表面上看好像啥也干不了实际上它是“等待指令”的状态。在这个状态下你可以执行删除、复制、跳转、搜索等操作但还不能直接输入文本。要输入内容按i进入插入模式Insert Mode。这时你才能像在普通编辑器里一样打字。输入完成后按Esc回到普通模式。编辑完成后需要退出。在普通模式下依次输入:q退出不做任何保存。:q!强制退出放弃所有未保存的修改。:w保存但不退出。:wq保存并退出。:x效果类似于保存退出如果文件没改过则不重新写盘。这里要特别注意冒号开头的都是命令行模式下的操作它们必须按Enter才生效。我在早期犯过一个低级错误打完:wq没按回车还一直奇怪为什么文件没保存。提示只用三招就能撑过新手期——i进入插入模式Esc回到普通模式:wq!保存退出。千万不要在第一次使用时就想着背全套 vim 教程。2.2 移动光标h、j、k、l 与更快的跳转方式新手最容易忽略的就是移动。他们往往还在用方向键一个个挪动速度慢得惊人。vim 的普通模式中h光标左移j光标下移k光标上移l光标右移这四个键其实不需要刻意背你只要知道 vim 把右手小指和食指放在这四个键上有天然的编辑节奏就行。配合数字前缀可以直接跳跃多行比如5j向下移动 5 行、3l向右移动 3 列。这个数字前缀在 vim 里非常通用后面所有操作几乎都能用。比逐行移动更快的是按词移动w跳到下一个单词的词首b跳到上一个单词的词首e跳到当前单词或下一个单词的词尾行内快速定位0跳到行首$跳到行尾^跳到行首第一个非空字符f加字符比如fx光标会跳到本行下一个x字符上t加字符跳到该字符前一个位置通常配合删除使用跨行长距离跳转gg跳到文件第一行G跳到文件最后一行:行号跳到指定行比如:42直接跳到第 42 行CtrlD向下翻半屏CtrlU向上翻半屏CtrlF向下翻整屏CtrlB向上翻整屏关于移动我有一条很具体的建议如果你要逐行看一段代码别用jjjj四次连按直接4j如果你要跳到函数名时先gg到文件头再/func_name搜索效率会高好几倍。这里的核心思路是“先算距离、再选跳法”而不是一格一格挪。2.3 删除、复制、粘贴与撤销用“动作加范围”理解一切很多初学 vim 的人记删除命令时非常痛苦因为组合太多了删除一行、删除一个词、删除到行尾、删括号里面……但如果把它们拆成“动作加范围”的语法事情就变得很整齐。在普通模式下删除是以d为动词后面接范围或对象x删除光标所在位置的单个字符dw删除光标到词尾的内容diw删除光标所在的单词但不删除单词后面的空格daw删除光标所在的单词连同单词后的空格一起删除d$或D删除光标到行尾d0删除光标到行首dd删除整行dG删除当前行到文件末尾ggdG删除全部内容这个组合在清空文件时很管用复制粘贴也是同样的结构。复制用yy复制当前行yw复制当前词y$复制从光标到行尾yiw复制当前单词粘贴用p粘贴在光标之后P粘贴在光标之前撤销和重做u撤销最近一次修改CtrlR重做用一个实际例子把这套组合串起来。假设文件里有这样一行const name vim;光标停在vim的v上想快速把整个字符串值换掉我不需要按方向键走到引号里删半天只需要ci。这个命令的意思是“删除双引号内部的内容并进入插入模式”直接重新输入就行。再比如经常遇到的一整行配置想复制到另一个位置我只需要yy再移动到目标行位置按p几秒钟就搞定了比鼠标拖选快太多。这里有一个很多人刚接触时会困惑的点diw和daw的区别。简单记i是“inside”内部a是“around”包含周围。如果你只想删单词本身用i如果想连单词后的空格一起清掉用a。同样的逻辑适用于ciw、caw、yiw、yaw。2.4 搜索、跳转与窗口编辑多文件时的保命技巧如果你只是偶尔改一个文件前面的内容已经能应付。但真实工作里经常需要在一个文件里搜索关键字、快速跳转或者同时打开多个配置文件对比修改。这里有一套很实用的基础操作。搜索/keyword向下搜索关键字?keyword向上搜索关键字n跳到下一个匹配项N跳到上一个匹配项跳转历史CtrlO跳回上一个位置CtrlI跳到下一个位置与 CtrlO 相反多文件操作:e filename打开另一个文件:bnext或:bn切换到下一个缓冲区文件:ls查看当前打开的缓冲区列表:bd关闭当前缓冲区窗口分割:split或:sp水平分割窗口:vsplit或:vs垂直分割窗口CtrlW后按方向键在不同窗口间切换CtrlW后按q关闭当前窗口这块我自己的使用心得是如果是临时对比两个配置文件优先用:vsplit如果是来回修改源代码和测试文件优先用缓冲区加CtrlO跳转。窗口多了反而眼花最好只开两到三个。3. 让 vim 更适合日常使用的配置与增强3.1 从零开始写一份能用的 .vimrcvim 的默认配置是为兼容各种环境而生的这意味着它的很多特性并没有被打开。想让它更顺眼、更顺手最直接的方式就是创建一个用户配置文件即家目录下的.vimrc文件。这里先给一份我建议新手直接用的基础配置并解释每一行的实际作用 关闭兼容模式使用完整 vim 功能 set nocompatible 打开语法高亮 syntax on 显示行号 set number 显示右下角状态信息比如当前行列号 set showcmd 高亮当前行方便查找光标位置 set cursorline 设置终端下使用真彩色 set termguicolors 自动缩进 set autoindent 统一缩进为 4 个空格 set shiftwidth4 set softtabstop4 set tabstop4 让 Tab 键变成空格缩进 set expandtab 搜索时忽略大小写 set ignorecase 搜索时智能大小写全小写则忽略含大写则区分 set smartcase 搜索时动态显示匹配结果 set incsearch 禁掉铃铛声避免出错时“滴”一下 set noerrorbells set visualbell 剪贴板与系统剪贴板共用部分环境需 vim 支持 clipboard set clipboardunnamedplus 记住最后编辑位置 autocmd BufReadPost * if line(\) 1 line(\) line($) | execute normal! g\ | endif这份配置谈不上花哨但它解决了几个最让人难受的默认问题没行号、Tab 和空格混在一起、缩进乱、搜索时大小写敏感、出错时响铃。写完这份配置后重启 vim 就能立刻感受到差别。关于 Tab 转空格这件事我想多解释两句。很多人纠结“到底该用 Tab 还是空格”但团队项目里通常会统一使用空格缩进。expandtab会把你按 Tab 键输入的内容自动转换为空格这也能避免某些工具显示 Tab 宽度不一致导致的排版错乱。如果你在改某个强制要求 Tab 缩进的 Makefile 或老项目可以临时用:set noexpandtab改回。注意.vimrc的生效范围是当前用户。如果你用 root 登录那么 root 的家目录下也要一份配置才能让 root 用户享受同样的体验。多台服务器之间搬运.vimrc很简单直接复制文件就行。3.2 快捷键映射把高频率操作绑到顺手的位置vim 的快捷键机制非常灵活可以用map系列命令把某个按键组合替换成一系列操作。配置文件里的映射主要分三类map作用于普通模式imap作用于插入模式noremap/inoremap非递归映射即右侧命令里的按键不会被再次展开强烈推荐使用这种首先是设置 leader 键。leader 相当于自定义快捷键前缀默认是反斜杠\很多人会改成空格let mapleader 然后可以定义一些高频操作。我用的几个映射 快速保存 noremap leaderw :wCR 快速退出当前窗口 noremap leaderq :qCR 清空搜索高亮 noremap leaderspace :nohlsearchCR 把 jk 作为返回普通模式的快捷键 inoremap jk Esc 打开新的垂直窗口 noremap leaderv :vsplitCR 跳到行尾并插入 inoremap C-e EscA这里CR表示回车键leaderw实际上就是空格加w。用了 leader 键之后保存动作从冒号加两个字母变成两个键速度提升很明显。把jk映射成返回普通模式是一个极其常见的手法因为j和k之间正好在食指和中指位连按非常自然而且几乎不会在日常输入中遇到组合误触。有一个很容易踩的坑映射数量不要贪多。配置里堆一百多个快捷键看起来很强实际上能记住的没几个。我建议每个新用户只从三四个最高频的操作开始加用熟了再慢慢补。3.3 插件管理什么时候值得装插件我见过很多新手一上来就大搞插件体系动不动就装文件树、装状态栏、装补全框架折腾半天配置弄得比项目还复杂。我的建议是插件在入门阶段不是必需品少而精才是正解。如果你的 vim 已经能满足日常编辑和服务器配置修改那么完全可以不装任何插件。等确实遇到痛点了再去针对性解决。比如不知道当前打开哪些文件装一个模糊查找插件比如某种fzf.vim类方案看代码需要目录树装一个文件树类插件比如某种nerdtree类方案想要显示 Git 改动状态装一个 Git 集成插件比如某种vim-fugitive类方案希望底部状态栏更好看装一个状态栏插件比如某种lightline.vim或同类方案插件管理本身需要一个插件管理器。目前常见的选择是 vim 版的vim-plug它的配置方式比较简洁示例call plug#begin(~/.vim/plugged) Plug preservim/nerdtree Plug junegunn/fzf, { do: { - fzf#install() } } Plug tpope/vim-fugitive call plug#end()设置好之后在 vim 里执行:PlugInstall就会自动安装插件。不过要提醒一句有的插件依赖外部工具比如 fzf 终端模糊查找需要系统安装对应程序装之前最好看看插件的文档免得安装了没反应还以为是 vim 的问题。我个人的配置里插件数量常年控制在五个以内。插件越多启动越慢版本升级时互相冲突的可能性也越高。服务器上的环境更是少装为妙毕竟你不可能每台机器都有网络权限去下载插件。3.4 远程服务器上的 vim无桌面环境的编辑事实标准前面说过vim 在远程环境里就是事实标准。借这个场景讲讲具体怎么“干活顺手”。远程和本地最大的区别是你手里可能只有键盘、终端连鼠标都不好使。不能复制粘贴本地文件也不能用本地图形化 IDE 直接改服务器上的文件。这时候用 vim 就要掌握一套适合远程场景的组合。第一确认软件环境。大多数服务器没有完整 vim只装了vi精简版它的行为在某些地方和 vim 有差异。可以用vim --version查一下版本或者直接vim看会不会提示要安装完整版。如果系统里只有vi也可以装vim-minimal或用nano做临时替代但长期看还是要有 vim 的。第二远程改配置时少依赖图形界面、多依赖指令。比如我想看到行号就直接按:set number想高亮某一段直接用可视化模式 搜索想知道当前在第几行右下角状态栏已经显示出来了。第三复制粘贴跨终端的问题特别常见。在终端里用 vim 时鼠标选中内容复制到的往往不是 vim 的寄存器而是终端的剪贴板。想从本地复制一段内容贴进远程 vim可以试试支持真彩色与剪贴板功能的现代终端再配合 vim 的p或*p寄存器粘贴。不过不同的终端软件对剪贴板的支持并不一致如果发现粘贴的内容乱了说明终端环境或 vim 编译选项还需要调整这时候不要死磕直接改用 tmux 面板复制粘贴或者用临时文件中转也能绕过去。第四远程文件加密或权限受限时直接用 vim 修改可能会提示 “readonly option is set”。请注意这是文件权限问题不是 vim 问题。你要么用chmod调整权限要么用有权限的用户登录别硬加:w!去强制保存那只适合你确信自己知道在改什么时用。4. 常见问题与排查技巧实录4.1 想退出时按什么都没反应这是最经典的问题。卡在“想退退不出”的状态里通常是以下两种情况之一第一种你还在插入模式里。无论按什么屏幕上都在输入字符而不是执行命令。这时候先按Esc回到普通模式再看左下角是否变成空状态然后输入:q回车。第二种你按了很多键终端里出现了一串你都不认识的内容干脆直接按CtrlC中断当前操作按Ctrl[也能起到类似 Esc 的作用。然后再执行退出命令。如果文件被修改了q会提示No write since last change而拒绝退出。如果你确定不想要这些修改可以:q!如果想要保存退出就:wq。这里提供一个“无脑退出三分法”状态处理顺序含义卡在插入模式Esc 或 CtrlC 或 Ctrl[回到普通模式普通模式提示未保存:wq保存并退出想放弃所有修改:q!强制退出4.2 方向键和退格键异常按方向键变成 ABCD这个问题极具迷惑性。你在插入模式下按方向键发现屏幕上冒出的是[[[[或者ABCD退格键也不能正常删除字符。主要原因有两个方面。第一vim 检测到旧终端或兼容模式把方向键当作控制序列解析了出来。解决办法是确保配置文件里有set nocompatible并且不要在-x兼容模式下运行 vim。第二终端本身发送的按键编码较特殊vim 没有识别出来。这时候可以尝试用:set term强制指定终端类型或者在.vimrc里配置合适的 term 和 backspaceset backspaceindent,eol,start这条设置允许退格键在缩进、行尾和输入开头处都能正常删除能解决大部分退格异常。如果试了还不行先别钻牛角尖多半是终端模拟器的兼容问题。换用一个终端再试或者直接在普通模式下用x删除字符也能绕过去。4.3 粘贴代码时缩进错乱这是 vim 用户几乎都踩过的坑。从浏览器或其他编辑器复制一段代码进 vim 粘贴后所有行全部被自动缩进打乱看起来一团糟。原因是 vim 的自动缩进和贴进去的多行文本发生了冲突。最直接的解决办法在粘贴前进入无缩进模式:set paste然后按i进入插入模式粘贴完成后用:set nopaste恢复。但每次都要敲这么长的命令确实烦人所以可以在配置里加一个快捷键切换set pastetoggleF2这样按一下F2就切换 paste 状态左下角会出现-- INSERT (paste) --的提示明确了当前可粘贴。粘贴完再按一下F2回到正常插入模式。另一个常见做法是使用 vim 的寄存器粘贴。如果你的 vim 支持剪贴板可以先用系统剪贴板复制内容再在普通模式下输入p这种方式往往不会触发自动缩进问题在图形环境下尤其好用。4.4 中文乱码与编码显示问题远程服务器上的文件出现中文乱码很常见通常不是文件坏了而是 vim 没有按正确的编码读取文件内容。常见的表现是中文显示成\xe4\xb8\xad或者一堆问号。处理思路是这样的先判断文件本身是什么编码file 文件名如果输出里带着UTF-8 Unicode text说明文件确实是 UTF-8 编码。那么你应该让 vim 使用 UTF-8 读取和显示set encodingutf-8 set fileencodingsutf-8,gbk,gb2312 set fileencodingutf-8encoding是 vim 内部使用的字符编码fileencodings是 vim 自动检测文件编码的顺序fileencoding是当前文件要保存时的编码。把utf-8放在最前面是让 vim 优先按 UTF-8 处理。如果你在改一个老的 GBK 编码文件又不想转换它可以在打开文件后执行:e encgbk强制重新按 GBK 读取。想转换文件编码则用:set fileencodingutf-8再:w保存。整个逻辑不复杂先确认原文件编码再告诉 vim 按什么编码读写。4.5 粘贴内容不对、字母被变成命令其实终端缓冲区在捣乱还有一种看起来像 vim 出问题的情况你往 vim 里粘贴内容结果粘贴进去的全是经过终端映射的按键序列字母、符号混在一起甚至触发了 vim 的动作。这实际上是终端粘贴模式bracketed paste没有真正生效。正常情况下终端会告诉 vim 它正在做一次粘贴vim 应该暂时关闭自动缩进和快捷键映射但有些终端配置或旧版 vim 不支持这个协议。处理办法有两条一条是在配置里开启set paste后再粘贴另一条是使用有可信赖实现剪贴板功能的 vim 编译版本。检查自己的 vim 是否支持剪贴板可以执行vim --version | grep clipboard看到clipboard表示支持-clipboard表示不支持。不支持的版本还可以用更粗暴但有效的方案把内容写进一个临时文件再在 vim 里用:r 临时文件名读入这样完全绕开终端粘贴。5. 一点使用心得vim 不是靠背命令学出来的这篇心得写到这最想跟新朋友分享的其实不是某一个命令而是学习姿态的问题。我见过太多人拿到 vim 教程就开始背命令列表背了两天就放弃了。这个思路从一开始就跑偏了。vim 的输入方式更像练滑板、打字、弹琴靠的是肌肉记忆不是记忆术。你知道一百条命令不如把一个“进入插入模式再返回普通模式”练到闭着眼都能完成。所以练 vim 最好的路线反而是“做中学”每周挑一个固定的场景用 vim 去完成比如编辑服务器配置文件、写脚本开头、整理日志片段。在真实任务里那些高频的命令会反复出现自然就记住了低频命令就算一时想不起来查一下也完全没问题。我自己到现在也还会出现CtrlC中断一个不小心触发的大范围操作这种情况但这并不影响我把 vim 当作日常主力。它不能让你一夜之间变成终端大神但可以肯定的是你每天在终端前花掉的编辑时间里有一大半能够被这套存续了几十年的模式化编辑习惯省下来。最后分享一个小技巧每次你发现自己在 vim 里做占用三个以上键位动作的重复操作时停下来想一想这个动作能不能用一个宏或者映射一键完成。这个思考过程比操作本身更值钱它会逼着你一点点去接近 vim 真正的核心理念把编辑动作拆解成可以组合的语言而不是零星几个死命令。