
在 Linux 环境里待久了你的日常工作基本都绕不开一个叫 vim 的编辑器。不管是远程 SSH 登录服务器改配置、写个 shell 脚本还是在没有图形界面的机器上快速调整文本vim 几乎都是系统自带的第一选择。很多新手第一次在终端里敲下 vim 文件名发现光标不跟着方向键走马上就懵了。这篇文章我们就把 vim 的使用拆开讲清楚从一个文件从打开到保存的完整流程入手逐步覆盖移动、编辑、查找替换和常见报错帮助你快速进入日常使用状态。顺便先说结论vim 不是那种你装完就要马上学会所有功能的软件它更像一门需要用肌肉记忆去掌握的“文本操作语言”。你只要把最常用的二三十个命令变成手指的本能再配合 Linux 下的其他命令效率会明显超过在图形界面里点来点去。今天我们聊的内容适合刚接触 Linux 的新手也适合已经用 nano 或图形编辑器、但想系统掌握 vim 的运维和开发同学。1. 编辑器还是编译器先搞清 vim 是什么1.1 编辑器和编译器一字之差两种东西很多刚接触 Linux 的人会把“编辑器”和“编译器”混在一起面试时被问到也容易卡壳。其实两者分工完全不同编辑器负责修改文本内容比如写一段代码、改一个配置、记一段日志编译器负责把写好的源代码转换成机器能运行的程序。你可以把编辑器想象成稿纸和笔它只负责写字编译器是翻译官负责把稿纸上的内容翻译成电脑真正能执行的指令。vim 属于前者它本身不会帮你编译代码但它能让你在终端里非常自如地操作纯文本文件。在 Linux 服务器上这种能力尤其重要因为很多生产环境没有图形桌面你面对的就是一个终端窗口和一个命令行。此时 vim 就是你和文件之间的桥梁所有增删改都在按几个键的瞬间完成。1.2 vim 的模式设计不是 bug是效率vim 最劝退新手的一点是它默认进入后不能直接输入文字按下方向键甚至不会移动光标。这种体验背后其实是 vim 的核心设计模式。它不像 Windows 记事本永远处于“可以打字”的状态vim 把操作分成不同模式最常用的是普通模式、插入模式和命令模式。普通模式是 vim 的默认状态在这个模式下键盘上每个键都不是输入文字而是执行命令。比如按 j 是向下移动一行按 x 是删除光标下的字符。插入模式才是真正给你写字的模式按下字母 i 进入此时输入什么就在文件中显示什么。命令模式用于执行保存、退出、替换等操作正常是在普通模式下按冒号进入比如 :wq 就是保存退出。刚上手时最容易犯的错误就是人还在插入模式就急着输冒号结果冒号变成文章里的一个字符。看到左下角显示“-- 插入 --”时记得先按 Esc 回普通模式。这种模式设计看似多此一举实际上是为了让你手不离开键盘。普通模式下所有命令都在字母区不需要去点菜单或按组合键移动、删除、跳转、复制都是一瞬间的事。用一个类比它很像老式相机上的手动模式平时在自动档按快门就行但当你需要精准控制曝光时手动模式才是效率最高的。1.3 为什么 Linux 生态离不开 vimLinux 下编辑器非常多有 nano、emacs、gedit 等但 vim 几乎每个发行版都预装或者可以通过官方源一键安装。它的运行依赖非常少资源占用低在内存紧张的服务器上也能流畅运行。更重要的是vim 不依赖图形环境只要有一个终端和键盘就能工作所以在远程管理、故障排查、临时改文件这些场景里格外可靠。另外 vim 的配置和操作习惯是可迁移的。你在一台机器上熟悉了 vim换到另一台 Linux、macOS 甚至通过 WSL 使用 Linux体会都一样。很多运维同学之所以推荐新手先学 vim不是因为它是“最好的编辑器”而是因为在 Linux 生态里你迟早会需要它。2. 基础命令从打开文件到安全退出2.1 第一次进入 vim插入模式、普通模式在终端执行 vim test.txt如果文件不存在vim 会在保存时自动创建它。进入后你会看到一堆波浪号或者空白行此时处于普通模式还不能直接打字。按一下字母 i底部出现“-- 插入 --”字样这时才可以键入内容。这个“先按 i 再打字”的过程是新手最容易忽略的一步。我见过不少人在普通模式下敲了一篇文章发现一个字都没进去还以为文件坏了。其实很简单输入任何内容前先确认你在插入模式。要回到普通模式就按 Esc这是 vim 里最安全、用最频繁的一个键。写完内容后先 Esc 回到普通模式再输入 :wq 保存并退出。注意冒号是英文半角冒号不要用中文输入法打冒号否则命令不识别。如果你写了内容但是想放弃就用 :q! 不保存退出。如果只想保存但继续编辑用 :w 或者按 Esc 后输入 :w然后继续工作。这张最简单的命令表可以先背下来操作命令说明打开文件vim 文件名不存在则新建进入插入模式i在光标前插入进入普通模式Esc随时返回保存:w写入文件保存退出:wq常见收尾操作不保存退出:q!放弃修改强制退出:q!文件只读时也用2.2 光标移动h j k l、gg、G、行首行尾vim 在普通模式下的方向移动不用方向键而是用 h j k l 四个字母h 向左、l 向右、j 向下、k 向上。很多新手觉得这几个键反直觉尤其是 j 和 k 容易搞混。我自己的记忆方法是j 上面有个向上的钩子感觉像往下走而 k 这个字母朝上用来上移。用上一段时间后手指会比大脑更早反应过来。除了逐字符移动更常用的是按词移动和按行跳转。普通模式下按 w 跳到下一个单词开头按 b 跳回上一个单词开头按 e 跳到当前单词末尾。想快速到文件结尾按大写的 G到文件开头按 gg。行内移动也有快捷方式按 0 到行首按 $ 到行尾按 ^ 到行首第一个非空白字符。这些移动命令在长文件里非常有用。比如查看一个几万行的日志你不可能靠方向键一屏一屏翻。你可以按 Ctrlf 向下翻页、Ctrlb 向上翻页或者直接输入行号后按 G比如 150G 直接跳到第 150 行。熟练之后你就不再需要鼠标滚轮了。2.3 删除、复制、粘贴、撤销先记住这几个编辑文件无非是增删改查vim 的删除和复制命令同样集中在普通模式。按 x 删除光标所在字符按 dd 删除整行按 dw 删除一个单词。删错了就按 u 撤销这和很多图形编辑器一样如果撤销多了按 Ctrlr 重做。复制在 vim 里叫“寄存器操作”但没有图形界面那么直观。普通模式按 yy 复制整行按 p 把复制内容粘贴到光标下一行。光标移动后想复制多行可以在命令前加数字比如 3dd 删除三行2yy 复制两行这个数字和命令的组合规则几乎贯穿所有 vim 操作值得花点时间适应。实际操作时有一个细节在插入模式里用 Backspace 删字符和在普通模式里用 x 删字符删除范围是一样的但普通模式可以连续按 x 快速清空一串字符而插入模式更符合日常打字习惯。我的建议是刚开始不用记太多删除命令先把 x、dd、u 这三个练熟后面的命令慢慢积累。3. 实战演示用 vim 写一个 Linux 脚本3.1 场景说明清理磁盘日志脚本光记命令太抽象我们直接做一个实际任务。假设服务器上有个应用每天往 /var/log/myapp/ 目录写日志时间长了磁盘容易满。我们需要用 vim 写一个 shell 脚本 cleanup_logs.sh功能是删除 7 天前的日志文件。这个脚本很小但正好覆盖 vim 的编辑、保存、修改、替换等基本操作。打开文件vim ~/cleanup_logs.sh进入后是一个空文件。按下 i 进入插入模式输入下面这三行核心内容#!/bin/bash find /var/log/myapp/ -type f -mtime 7 -delete echo old logs removed按 Esc 退出插入模式然后输入 :wq 保存退出。退出后用 ls -l 看一下你会发现脚本还只是一个文本文件没有执行权限。此时在 Linux 命令行执行 chmod x ~/cleanup_logs.sh 添加执行权限这才是把“编辑器”和“命令行工具”结合起来的完整流程。3.2 逐步操作实录修改脚本中的路径过了几天应用日志路径从 /var/log/myapp/ 改成了 /data/logs/myapp/我们需要更新脚本。重新用 vim 打开文件vim ~/cleanup_logs.sh此时光标停在第一行。普通模式下按 $ 跳到行尾再按 A 在行尾进入插入模式并追加内容。但如果你只需要修改中间那一行 find 命令可以先按 G 跳到文件末尾然后用 k 一次次向上移动也可以直接输入行号加 G比如 2G 直接到第 2 行。来到第 2 行后我们希望把 /var/log 替换成 /data/logs。手工删除费劲更快的方法是使用替换命令。在普通模式下输入 :%s//var/log/myapp//data/logs/myapp/g回车后所有匹配的路径都会自动替换。如果不熟悉正斜杠转义一眼看上去会有点密但 vim 的替换语法其实很好理解下一节我会详细拆开讲。修改完成后按 :wq 保存退出再执行一次 ./cleanup_logs.sh 测试。如果终端输出 “old logs removed”说明脚本正常执行。这就是一次完整的 vim 工作会话打开、编辑、保存、配合 shell 使用。3.3 把设置写进 .vimrc让配置“自动生效”每次进入 vim 都手动设置行号或高亮会非常啰嗦。vim 允许你通过家目录下的 .vimrc 文件保存默认配置启动时自动加载。比如我在 .vimrc 里至少会写这几项set number 显示行号 syntax on 语法高亮 set tabstop4 Tab 占 4 个空格 set shiftwidth4 缩进宽度 4 个空格 set expandtab 用空格代替 Tab set hlsearch 搜索结果高亮 set incsearch 输入搜索词时动态显示匹配 set encodingutf-8 文件编码创建或编辑 .vimrc 也用 vimvim ~/.vimrc写入配置后保存退出。重新打开任意文件行号和语法高亮就会自动生效。这套配置对写脚本、编辑配置文件都够用了。我建议新手不要一开始就折腾复杂插件先把原生 vim 用顺手。你后面如果做开发再考虑 vim-plug 和 coc.nvim 这些扩展也不迟。 .vimrc 的好处是让所有个性化设置沉淀为一个文件换机器时拷贝过去就能保持一致这也符合 Linux 下“一切皆文件、配置即代码”的习惯。4. 查找、替换和多文件编辑4.1 查找字符串斜杠、问号、星号vim 查找字符串最基础的方式是普通模式按 /然后输入你要找的内容回车。比如在文件里找 error就输入 /error。搜索后所有匹配的单词会高亮按 n 跳到下一个匹配按 N 跳回上一个。如果想向上查找用 ?error 代替 /error区别只是方向不同。高亮有时候很烦看到满屏高亮不想再找时输入 :noh 取消高亮这是“no highlight”的缩写。还有一个技巧普通模式下把光标停在某个单词上按 * 键vim 会自动搜索光标处的整个单词并跳到下一个匹配。这个在代码里查变量名特别高效比如在配置文件里找 database_host就不用自己敲了。需要注意的是vim 的搜索支持正则表达式。比如 /^root 会匹配以 root 开头的行/foo$ 会匹配以 foo 结尾的行。日常做简单查找时直接按字面字符串搜索没问题如果你发现搜索某个带特殊字符的文本结果不对可能是正则把字符解释了这时可以在前面加反斜杠转义。比如查 1.2.3 这个字符串可以输入 /1.2.3。4.2 替换语法从单行到全文vim 的替换命令是 :s完整结构是 :[range]s/old/new/[flag]。很多人看到这条命令就害怕其实拆开很简单。冒号表示进入命令模式s 表示 substitute 替换后面的斜杠把“查找内容”和“替换内容”分隔开最后面的 g 表示全局替换也就是这一行所有匹配都要换而不是只换第一个。举例说明:s/old/new/ 替换当前行第一个 old :s/old/new/g 替换当前行所有 old :%s/old/new/g 替换全文所有 old :2,5s/old/new/g 替换第 2 到第 5 行 :%s/old/new/gc 全文替换前逐个确认其中 % 代表所有行2,5 代表行范围。加上 c 时vim 每次替换前会询问y 确认替换n 跳过q 退出替换。这个对批量修改配置很安全特别是当你不确定某个词是否该全部替换时我一般先带个 c 执行一遍确认没问题再全量替换。初学时我常用的一招是先用不带 c 的替换但提前复制正确内容到寄存器替换错了马上按 u 撤销也很稳。如果你要替换的内容里包含斜杠比如路径可以用 # 或 作为分隔符避免一堆转义符。例如 :%s#/var/log#/data/log#g比 :%s//var/log//data/log/g 清爽得多。这是 vim 替换语法的常见优化。4.3 多文件与分屏日常运维经常要同时看两个文件比如对比配置和日志。vim 不用退出当前文件直接 :e /etc/nginx/nginx.conf 就能打开另一个文件。如果同时打开多个文件用 :ls 查看缓冲区列表再用 :bn 切到下一个文件、:bp 切回上一个文件。更直观的方式是分屏。普通模式下输入 :split 或 :vsplit打开水平或垂直分割窗口然后可以用 :e 加载另一个文件。窗口之间用 Ctrlw 再按方向键跳转。这样左边看配置右边看日志效率非常高。我在排查问题时经常一边是修改的脚本一边是执行输出的日志分屏观察比来回切换舒服得多。多文件编辑有一点要注意:q! 只会退出当前窗口不会影响其他窗口。如果系统提示有未保存更改普通 :q 会被拒绝需要用 :q! 强制退出。这个设计能避免你手滑丢掉其他窗口的修改。4.4 给多行加注释可视模式的高光用法vim 有三种可视模式小写 v 是字符选择大写 V 是行选择Ctrlv 是块选择。块选择是批量操作的利器最常见的场景是给多行加注释或删除注释。假设脚本里有 5 行需要临时注释掉先把光标移到第一行第一个字符然后按 Ctrlv 进入块选择再按 5j 向下选中五行接着按大写 I 进入插入模式输入 # 号最后按 Esc。你会看到 vim 自动给选中的每一行行首都加上了 #。这个操作我第一次看到时觉得很神奇因为它同时修改了多行内容。背后的逻辑是块选择先框住一列矩形区域再通过插入命令把文本插入到矩形区域的每一行。反向操作也一样块选择后的行首 #按 x 就能一次性删除这些 #相当于批量取消注释。这比一行一行去改效率高太多写脚本时非常实用。需要注意行首有缩进时块选择要选对列如果 # 没有贴在行首可能因为缩进关系插入位置不一致。这种小问题多试几次就明白了。5. 新手的坑和排查速查表5.1 “package vim is not available” 报错处理很多人用 Ubuntu 或 Debian 系统的 apt 安装 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。看到这个别慌一般是两种原因。第一种原因是软件源缓存太久没有更新。解决办法很简单先执行 sudo apt update 刷新软件包列表再执行 sudo apt install vim。第二种原因是默认源里没有启用 universe 组件vim 属于系统发行包里可能被拆成了 vim-tiny、vim-common、vim-runtime 等软件包如果你需要完整版有时要安装 vim-gtk3、vim-nox 或 vim-athena。如果 apt 依然报错可以看看输出中提到的替换包比如 vim-tiny实际已经装了简化版 vim。用 vim --version 看一下就能确认。安装好了之后配置文件权限要注意如果对系统级配置 /etc/vim/vimrc 修改需要 sudo vim /etc/vim/vimrc否则没有写权限会保存失败。个人配置放在 ~/.vimrc 则不需要 sudo这也是我更推荐的方式。5.2 按 Esc 没反应、文件只读、swap 文件新手最常问的问题之一是我按了 Esc为什么还在插入模式大概率是因为你真的按了 Esc但当前操作是等待状态比如已经输入了 : 但没按回车此时 Esc 会取消这次命令而不是退出插入模式。我的建议是每次都看一眼底部状态栏显示 “-- 插入 --” 才说明在插入模式普通模式的右下角一般是文件名和行号。另一个高频问题是文件只读。用 vim 打开了一个只有 root 可写的系统文件修改完后 :w 会提示 E45: readonly option is set。这时要么改用 sudo vim 重新打开要么用 :w! 强制写入。如果本来就不想改用 :q! 直接退出。vim 崩溃或异常退出后再打开同一个文件会出现 E325 警告提示存在 swap 文件。这是 vim 的安全机制防止两个进程同时修改一个文件。处理方式如果确认没有其他进程在编辑按 D 删除 swap 文件后重新打开或者直接手动 rm -f 文件.swp。但千万别在有其他 vim 进程时乱删否则可能丢失你的操作记录。5.3 方向键、退格和中文乱码在较老的 vim 版本或某些终端组合里插入模式按方向键会出现 A、B、C、D 字母这是因为终端把方向键转义序列解释成了字符输入。现代 Linux 发行版基本修复了这个问题但如果碰到可以尝试 :set nocompatible让 vim 工作在兼容性更好的模式。退格键删不掉内容也是常见问题尤其在 Ubuntu 默认配置下。解决办法是加入 set backspaceindent,eol,start 到 .vimrc。这三个选项分别允许退格删除缩进、断行处和行首之前的内容。设置后退格键会表现得和普通编辑器一样。中文乱码问题通常和编码设置有关。vim 默认可能不认识 UTF-8 之外的文件或者系统 locale 不对。在 .vimrc 里设置 set encodingutf-8再设置 set fileencodingsutf-8,gbk 让 vim 自动识别常见编码。通过 SSH 连接远程服务器时本地终端也要用 UTF-8否则即使 vim 正确识别了文件显示层还是可能乱码。5.4 Linux 面试题中常见的 vim 考点因为 vim 在 Linux 运维里出现频率太高面试官常会问几个基本操作本质上都在考察你是否真的动手用过。我把高频考点整理成一张速查表你可以背一背面试题答案怎么查找字符串/关键字n 下一个N 上一个怎么全文替换:%s/old/new/g怎么撤销和重做u 撤销Ctrlr 重做怎么跳转到指定行行号 G如 120G怎么跳转文件首尾gg 到首行G 到尾行怎么删除十行光标定位后 10dd怎么复制粘贴整行yy 复制p 粘贴怎么批量加注释Ctrlv 块选后 I 插入 #怎么退出不保存:q!怎么查看行号:set number如果你是去面运维岗光记住答案还不够最好自己在终端里把每条命令跑一遍。因为面试官很可能让你现场演示一个操作比如“把这行里的 error 全部改成 warning”。如果你是去面开发岗vim 的知识属于加分项但要优先保证能熟练操作系统、写代码和切文件别在基础操作上卡壳。6. 从入门到习惯一点学习建议6.1 不要背命令先跑一遍 vimtutor学习 vim 最大的误区是拿着一份命令清单死记硬背。命令背得再熟手指不熟悉也没用。更好的入门方式是直接在终端里运行 vimtutor。这个命令会打开一个教学文档里面用中文分步骤指导你练习移动、删除、插入、替换等核心操作全程大概三十分钟。我第一次学 vim 时就是每天跑一遍 vimtutor连续一周基础就牢固了。vimtutor 最宝贵的地方在于它把学习和操作合在一起你不需要一边看教程一边切到别的文件直接在同一个文件里跟着提示练。选一个不受打扰的时间段把练习当成打字游戏很快你就会发现 vim 的节奏感。学完 vimtutor 后你可以试着把日常工作里的文本编辑任务交给 vim比如改配置、写 git commit message、编辑 Markdown 文件强制自己不用鼠标。6.2 刻意慢下来看左下角模式指示新手操作 vim 时最毛糙经常按了一堆键才发现自己在错误模式。我的经验是刚开始练的时候刻意慢下来每次输入命令前先看一眼左下角的状态提示。普通模式会显示文件名和行列号插入模式会显示“-- 插入 --”可视模式会显示“-- 可视 --”。模式对了再做操作不要着急。还有一个习惯很值得养成移动不要长按 j 或 k而是用数字命令跳转。比如知道要往下走 8 行输入 8j 一次到位比连续按八次 j 快得多。删除、复制也一样先观察行数用 3dd、2yy 这类带数字的命令处理。这个习惯一旦形成你的 vim 操作会比用鼠标还快。6.3 把 vim 变成你的“主力编辑器”的路径从新手到熟练心里要有一个清晰的学习路径。第一阶段只求能打开、编辑、保存、退出第二阶段练好移动和查找第三阶段学会替换和分屏第四阶段开始配置 .vimrc 和安装少量插件。不用一上来就追求“花哨配置”我见过很多人在 .vimrc 里堆了一堆看不懂的插件结果连基础操作都不熟最后反而放弃了 vim。我自己在 Linux 下写了这么多年脚本最深的体会是 vim 的每一条命令都对应真实场景dd 快速清错行、gg 回到文件头、:wq 提交修改。学 vim 不需要天赋只需要几次“坚持顶过去”的耐心。当你的手指不再思考就能按出 10dd 和 :%s 的时候你会觉得当初那几天下定决心从 nano 转到 vim 的行动非常值得。