
Linux下写东西绕不开的编辑器就是vim。这句话不是标题党——不管你是运维、后端还是做嵌入式的只要和Linux打交道总有一天会被扔到一个没有图形界面的终端里而终端里最可靠、几乎必定存在的文本编辑器就是vim。很多新手第一次打开vim看到满屏波浪号和看不懂的键位第一反应是把它当记事本用结果连退出都不会。这篇就是把vim的日常用法拆开揉碎讲清楚怎么装、怎么改文件、怎么找字符串、怎么替换、怎么配置成顺手的样子以及我一路踩过的那些坑。这篇内容适合什么人看零基础想入门Linux的同学、要在服务器上改配置的运维、写代码但看到终端就发怵的人都适合。它不会让你一夜变成vim高手但至少能让你在终端里像用普通编辑器一样自然不用每次都在“怎么保存退出”这一步卡住。我尽量用大白话讲关键地方会补上操作原因这样你不仅知道怎么按还知道为什么这么按。1. 先想清楚vim到底是什么为什么非学不可1.1 终端里的编辑器不是编译器入门Linux的时候经常有人问“编辑器用什么编译器用什么”。先把这两个概念分清楚vim是文本编辑器它只负责处理纯文本不负责把代码变成可执行程序编译器gcc、clang、javac这类才负责做翻译工作。很多人看到“vim能写Python”“vim能写C语言”误以为编辑器越强代码就越能跑其实编辑器只是你写字的纸能不能跑要看解释器和编译器。你用Word还是用记事本写文章并不会改变文章内容但顺手的工具能明显提高写作效率。vim也一样它不参与编译和运行却能显著改变你在Linux下处理文本的效率。尤其是改配置文件、写脚本、看日志这些工作在服务器上极其常见没一个好用的编辑器你会难受很久。1.2 同样是命令行编辑器为什么选vim而不是nanoLinux自带的最简编辑器中nano也很常见。nano的帮助信息直接显示在底部新手友好改个简单配置用nano完全没问题。我推荐vim不是因为它比nano“高级”而是因为vim几乎在所有Linux发行版里都是默认标配最小化安装、容器镜像、救援模式里都能找到它的健壮性和可脚本化能力也远不是nano能比。一点都不夸张地说只要是干净的系统vim基本都在。就算没装一个包管理器也能很快搞定。而且vim对系统资源的消耗极低在远程SSH连接服务器时用vim打开几十兆的日志文件基本不会卡。nano没有模式的概念看起来更简单但遇到复杂的多文件操作、批量替换、宏录制它就显得太薄弱了。所以我的看法是nano可以作为一个“应急工具”vim才值得你长期投资。1.3 三个模式的心智模型在记事本里你敲什么键屏幕上就出现什么字。vim完全不是这个逻辑它分三个模式普通模式、插入模式、命令行模式。默认打开文件后处于普通模式这个模式下你按h、j、k、l是移动光标按i才进入插入模式开始打字。命令行模式则用来输入:w、:q、:s这类指令。这个模式切换是vim劝退新手的第一道门槛但也是vim效率高的根源——它不需要你频繁用Ctrl和Alt组合键也不需要鼠标去选中所有操作都能在不离开键盘主键区的情况下完成。我把这三个模式比喻成三种状态普通模式是“待机状态”只响应命令插入模式是“打字状态”你敲什么就是什么命令行模式是“给编辑器下指令”比如保存、退出、查找、替换。按Esc永远回到普通模式这一点先记住再慢慢体会其余细节。2. 准备工作安装、启动和第一份配置2.1 Linux下安装vim和确认版本多数Linux发行版默认只带一个vim的精简版完整版功能更多比如语法高亮、系统剪贴板支持这些都需要单独装。Debian和Ubuntu系用apt安装sudo apt update sudo apt install -y vimCentOS、RHEL、Fedora这类用dnf或yumsudo dnf install -y vim-enhanced # 老系统的写法 sudo yum install -y vim-enhanced安装完执行vim --version确认一下。能看到VIM - Vi IMproved这样的输出就说明装好了。如果公司内网或离线环境不能联网需要提前下载对应发行版的rpm或deb包再用安装命令本地安装。这里不需要展开但你要知道“没网也能装vim”这件事是可以做到的。2.2 第一次打开vim怎么安全退出在终端输入vim回车后你就进去了。想退出先按Esc确保处于普通模式然后输入:q!回车这是放弃修改、强制退出。如果只是打开没改动过文件直接输入:q回车就能退出。保存并退出是:wq这也是一天里被敲得最多的命令。千万别按CtrlC那只会中断当前命令不会退出vim。新手常见的画面是在vim里敲了一堆字不知道按什么最后把终端关掉重开。这个我特别懂因为我也干过。后来我养成了一个习惯第一次学习vim时先运行vimtutor系统自带的官方教程会手把手带你练一遍比谁教的都稳。2.3 先配一个最省心的.vimrcvim的默认配置很朴素没有行号也没有语法高亮很多人一进去觉得“这编辑器也太简陋了”。其实它把个性化都留给用户了。在终端执行vim ~/.vimrc如果文件不存在vim会帮你创建空文件。往里写几行最基础的配置比如set number syntax on set tabstop4 set shiftwidth4 set expandtab这几行的意思是显示行号、开启语法高亮、一个Tab占4个空格、自动缩进4个空格、用空格代替Tab。保存退出后重新打开vim世界就清爽很多。完整的推荐配置我放到第4节来写这里你只需要先建立起“vim可以被我定制”的概念。3. 高频命令实战移动、编辑、查找、替换3.1 移动光标从方向键里解放出来vim最基础的光标移动是h、j、k、l分别代表左、下、上、右。这个布局一开始很别扭但它的好处是手指不用离开键盘主键区。为什么这么设计因为早期键盘没有独立方向键而在终端里长期在基准键位上操作速度会明显比伸手去够方向键快。下面这张表是移动命令的核心建议边看边试按键作用h / j / k / l左移 / 下移 / 上移 / 右移w跳到下一个单词开头b跳到上一个单词开头$跳到当前行行尾^跳到当前行行首gg跳到文件第一行G跳到文件最后一行Ctrlf向下翻一屏Ctrlb向上翻一屏5G跳到第5行:行号跳到指定行vim里有一个通用语法命令前面加数字表示重复执行。比如3w是向右移动3个单词5j是向下移动5行。这个“数字命令”的思维方式在删除、复制时同样起作用你要早点习惯。3.2 编辑改字、删行、复制粘贴进入插入模式的几个最常用键i在光标位置前插入a在光标位置后插入o在当前行下方新起一行并进入插入模式O在当前行上方新起一行并进入插入模式普通模式下的编辑操作x删除光标所在字符dd删除光标所在整行yy复制光标所在整行p粘贴到光标所在行的下方u撤销上一次操作Ctrlr重做刚刚撤销的操作这些命令同样可以和数字组合5dd删除5行5yy复制5行y2w复制两个单词。如果你还想再进阶一点留意c这个命令它和d类似但删除后会立刻进入插入模式。比如cw是删除一个单词并且开始改它c$是删到行尾并且开始改。这个“操作目标”的思想是vim键盘流玩得飞起的核心。3.3 vim查找字符串/、n、N一次讲清在普通模式下按/然后输入你要查找的字符串比如error回车后光标会跳到第一个匹配的位置。此时按n往下跳下一个匹配按N往上跳上一个匹配。如果你想把查找方向反过来用?error它会从当前位置向前找。查找结果会高亮显示如果看着难受可以执行:noh取消高亮。经常需要在日志里忽略大小写查找可以提前执行:set ic再想区分大小写就执行:set noic。另外查找是支持正则表达式的比如/^foo找行首是foo的行/foo$找以foo结尾的行排查日志时极其好用。有一点要注意如果字符串里带着/这种特殊符号需要加反斜杠转义。例如你想找a/b要输入a\/b。这个不用死记遇到报错时想起来加反斜杠就行。3.4 vim替换命令从单行到全局的:s用法替换是vim里高频中的高频尤其批量改配置文件的时候。最基本的替换命令长这样:s/old/new/ 替换当前行第一个old :s/old/new/g 替换当前行所有old :%s/old/new/g 替换整个文件所有old :1,10s/old/new/g 替换第1行到第10行 :%s/old/new/gc 全局替换逐个确认这里有个新手经常踩的坑很多人执行:s/foo/bar只发现行内第一个foo变了后面没变于是怀疑vim坏了。其实vim默认每行只替换第一个匹配后面加gglobal才会替换行内所有匹配。%代表所有行没有%就只作用于当前行。最后那个cconfirm会在每次替换前问你是不是要替换回答y替换n跳过q退出替换。实际场景里我经常这么用把配置文件里的192.168.1.10批量替换成192.168.1.11一条:s命令下去就完事比手改几十行快得多。4. 把vim配置成趁手的工具4.1 一份适合新手的.vimrc推荐vim的配置都在~/.vimrc里每一行都是一条set命令。我目前用的基础配置不算花哨但足够日常set number 显示行号 set relativenumber 显示相对行号 syntax on 语法高亮 set tabstop4 Tab占4个空格的宽度 set shiftwidth4 自动缩进用4个空格 set expandtab 敲Tab时插入空格而不是Tab字符 set smartindent 智能缩进 set nowrap 长行不自动换行 set ignorecase 搜索时忽略大小写 set smartcase 搜索时如果包含大写字母则区分大小写 set hlsearch 搜索时高亮匹配项 set incsearch 边输入边搜索 set showmode 底部显示当前模式 set encodingutf-8 内部使用UTF-8编码 set mousea 允许鼠标操作说说几个容易引发疑问的。relativenumber打开后当前行显示实际行号上下行的行号则显示相对距离比如上方3行显示3这样配合3j、5k这类相对移动非常直观。smartcase要和ignorecase配合如果搜索串里全是小写就忽略大小写只要包含一个大写字母就严格区分大小写。mousea可以让鼠标滚动、点击光标位置在图形终端里体验更友好但在纯字符终端里作用有限。4.2 配置立即生效source命令修改完.vimrc后不需要退出vim直接执行:source ~/.vimrc配置就立刻加载了。如果你改了配置后vim启动直接报错可以用vim -u NONE启动一个不加载任何配置的裸vim这样至少能进去排查问题。改配置的通用原则是一次不要改一大坨每加几行就source一次确认没问题再继续下一组这样出问题能立刻定位是哪行配置惹的祸。4.3 插件先别急着上很多教程一上来就教你装Vundle、vim-plug、NerdTree我个人的经验是新手先别碰插件。vim原生的查找、替换、多窗口、宏录制已经能覆盖绝大部分需求。插件引入的配置错误、版本兼容问题、日常更新折腾很容易把学习动力磨没。等你用vim写东西已经感觉不到“思考键位”的时候再按需装一两个插件不迟比如文件树导航、状态栏美化、语法补全。另外在远程服务器上真的不用装一堆插件很多内网环境连网都上不了裸vim反而最稳定。5. 实战中的坑常见问题与排查5.1 安装报错package vim is not available, but is referred to by another package这串英文非常经典一般出现在Debian系系统上。报错全文大概是“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”。新手看到一大段英文容易慌其实原因大多是软件源缓存太旧。解决办法sudo apt update sudo apt install -y vim先更新源再安装大概率就好了。如果还是不行检查/etc/apt/sources.list和/etc/apt/sources.list.d/下的源配置是否可用换个可用的镜像源后重新update。极简容器镜像里可能连apt都没有但一般有对应的包管理工具Fedora系用dnfOpenSUSE用zypper按照发行版习惯来就好。5.2 中文乱码编码问题在Linux上打开Windows传过来的中文文件经常出现乱码这是因为编码不统一。Windows常用GBK系编码Linux默认UTF-8。vim处理这个问题靠三个设置set encodingutf-8 set fileencodingsutf-8,ucs-bom,gbk,gb2312,big5 set fileencodingutf-8encoding是vim内部的编码方式fileencodings是vim打开文件时按顺序尝试的编码列表fileencoding是保存文件时使用的编码。当你打开一个GBK文件时vim会按上面的列表依次尝试发现GBK能正确解码就按GBK处理不会乱码。如果打开后还是乱可以手动指定格式:e encgbk强制让vim以GBK编码重新加载这个文件。5.3 权限不足sudo vim不是万能的在服务器上改/etc下的配置经常遇到“readonly option is set”或“E212: Cant open file for writing”的报错。这代表当前用户没有写权限你需要用管理员权限编辑。最简单的做法是退出文件后执行sudo vim /etc/nginx/nginx.conf如果你已经用vim打开了一个只读文件又不想退出去重新打开可以在vim里执行这个命令:w !sudo tee % /dev/null它的大概意思是用sudo权限把当前缓冲区内容通过tee命令写回当前文件。这个命令对新手来说有点绕我更推荐直接退出再用sudo vim打开逻辑更清爽不容易弄混。有一个细节值得注意sudo vim真正加载的是/root/.vimrc不是你自己用户目录下的~/.vimrc。所以在普通用户下精心设置的缩进和高亮用sudo vim打开文件后全都消失了这是正常的。如果你确实希望用root跑vim时也带上个人配置可以执行sudo -E vim或者直接把配置复制到/root/.vimrc。5.4 终端卡死、方向键乱码、Esc失灵操作vim时按了CtrlS屏幕突然像卡死一样什么都敲不动。这不是vim崩溃了而是终端流控把屏幕锁住了。Linux终端里CtrlS是暂停输出CtrlQ是恢复输出。你只需要按一下CtrlQ界面就活了。方向键在普通模式下输出A、B、C、D或乱码也是终端和vim之间的兼容问题。如果你设置了set nocompatible仍然不行就老老实实用h、j、k、l在纯字符终端里反而更省心。另外如果你不小心打开了一个二进制文件vim会提示filename is a binary file. Continue anyway?。碰到这种提示直接按q退出或者先Esc再:q!千万别保存保存会把原文件写坏。这条是我当年在服务器上误看二进制日志总结出来的惨痛教训。5.5 误操作后悔药u、Ctrlr和备份习惯vim的撤销很强大按u撤销上一步操作撤销多了按Ctrlr重做。如果你误删了很多内容不要傻眼撤销是分块记录的连续按几次u就能一步步找回。但如果你删完又保存了那撤销也救不回来。所以我有一个长期养成的习惯改重要配置文件前先复制一份备份cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak改坏了就迅速用备份恢复。vim里也可以设置自动备份不过我更推荐手动备份因为一个.bak文件放在旁边随时知道改前长什么样心理踏实得多。6. 从会用变得高效几个值得养成的习惯6.1 别贪多先练vimtutor很多Linux发行版自带vimtutor直接在终端输入vimtutor就能进入。它是一个交互式教程里面有虚拟文件带你把移动、删除、修改、查找、替换这些基础操作从头到尾练一遍。每天花十几分钟坚持一周基本的肌肉记忆就能建立。更有效的方法是给自己定一个目标接下来一周写笔记、写脚本、改配置全部用vim完成。哪怕是慢也要坚持不用图形编辑器。真实场景下的“被迫使用”比看一百篇教程都管用。6.2 在真实工作流里用起来vim的价值要在真实场景里才能发挥。用crontab -e编辑定时任务默认打开的就是vim用git commit不写-m参数也会进入vim写提交信息在服务器上改nginx配置、写shell脚本到处都是练习机会。刚开始用git时很多人不知道怎么在vim里写提交信息一头雾水。其实非常简单进入vim后按i进入插入模式写下你的提交信息然后按Esc退出到普通模式输入:wq回车保存退出。一次git提交就是一次vim练习这种机会别浪费。6.3 保持轻配置把vim融入终端工作流我个人的做法是让vim保持“原生加轻配置”状态只加行号、高亮、缩进这些必要设置不装太重的东西。需要看文件结构就配合tree命令需要多文件操作就开多个终端窗口或tmux分屏。这样不管跑到哪台机器上都能无缝上手不用到了新环境才去折腾配置。如果你以后想要IDE的完整体验两条路都很成熟一是给vim装插件管理系统配出你的专属IDE二是直接使用VS Code、JetBrains系列里的vim模拟模式。但无论走哪条路底层基本功都是这些键位先练熟永远不吃亏。6.4 最后一个小技巧把Esc换成Ctrl[长时间用vim你会发现右手小拇指去够Esc键非常累。很多老手会把Esc映射成Ctrl[因为这两个键在终端里字符编码是一样的在vim里按Ctrl[完全等同于按Esc。不想改习惯的话也可以把大小写锁定键映射成Esc或者用插入模式下的jj组合键快速返回普通模式inoremap jj Esc这个映射写进.vimrc后处于插入模式时连按两个j立即回到普通模式。中文输入法状态下尤其好用手指不用离开字母区也不怕误触。类似这样的小优化等你用vim一段时间自然会发现更多不必一开始就全盘照抄。我个人在使用中的体会是vim的学习曲线确实陡但只要熬过最初半个月后面收益会越来越大。它不是一个你要“崇拜”的工具而是一个每天都要握在手里的方向盘。把这篇文章里的命令练熟至少下次再有人问“vim怎么退出”你就能带着过来人的语气告诉他先按Esc再输入:wq然后享受屏幕那行长长的命令把文件保存好的踏实感。