de风——【Linux从零开始】(四):Vim编辑器入门——从“一脸懵“到“手指飞“的保姆级教程
环境说明本系列使用Xshell 7连接腾讯云服务器 Ubuntu 22.04进行操作演示。如果你还没有搭建好环境请先阅读本系列前面的文章。前言在前三篇文章中我们学会了用 Xshell 连接腾讯云服务器、掌握了 Linux 基本指令和文件操作。但是当我们要在服务器上编写代码、修改配置文件时纯命令行操作就显得力不从心了——总不能每次都把文件下载到本地改完再传回去吧这时候一款强大的命令行编辑器就必不可少了。而Vim就是 Linux 世界中最经典、最强大的编辑器之一。很多人对 Vim 的第一印象是难学、反人类但只要你理解了它的多模式设计思想就会发现它的操作效率远超普通编辑器。本文将从零开始带你一步步掌握 Vim 的基本使用。思维导图下面是本文内容的完整思维导图建议先整体浏览一遍建立全局认知后再逐节学习。一、Vim 简介与三大模式1.1 什么是 VimVimVi IMproved是从 Vi 发展出来的文本编辑器它是 Linux 系统中最常用的编辑器之一。与 Windows 下的记事本、VS Code 不同Vim 最大的特点是多模式设计——不同的模式下同一个按键代表完全不同的含义。新手提示如果你觉得 Vim 难用不要灰心它的学习曲线确实陡峭但一旦上手你会发现它的操作效率非常高。很多现代编辑器如 VS Code都提供了 Vim 快捷键插件学好 Vim 受用终身。1.2 Vim 的三大工作模式Vim 主要有三种工作模式这是学习 Vim 的第一关务必理解清楚模式说明如何进入命令模式Normal ModeVim 的默认模式用于光标移动、复制、粘贴、删除等操作打开文件时默认进入任意模式按Esc回到此模式插入模式Insert Mode用于输入和编辑文本类似普通编辑器的编辑状态命令模式下按i、a、o等键底行模式Command-Line Mode用于保存、退出、替换、分屏等高级操作命令模式下按:Shift ;1.3 模式切换关系图i / a / o ┌──────────────────┐ │ ▼ 命令模式 插入模式 │ │ │ Esc │ │ ◄────────────────┘ │ │ : (Shift;) ▼ 底行模式 │ │ Esc └──────────────────► 命令模式记忆口诀命令模式是心脏所有模式都通向它。无论你身在哪个模式按Esc就能回到命令模式。记住这一点你就不会在 Vim 里迷路了。示例体验模式切换——演示三种模式的基本切换流程在 Xshell 中连接你的腾讯云服务器后执行以下操作bash# 1. 创建并打开一个测试文件 vim test.txt此时你进入了命令模式注意看左下角没有特殊提示。bash# 2. 按键盘上的 i 键进入插入模式 # 此时左下角会出现 -- INSERT -- 字样 # 输入一些文字 Hello, Vim! I am learning Linux.bash# 3. 按 Esc 键回到命令模式 # -- INSERT -- 字样消失 # 4. 按 : (Shift;)进入底行模式 # 左下角出现冒号提示符输入 wq 保存退出 :wqbash# 5. 用 cat 查看文件内容确认保存成功 cat test.txt # 输出Hello, Vim! I am learning Linux.二、命令模式操作命令模式是 Vim 的核心模式也是你使用频率最高的模式。在这个模式下你无法直接输入文字但可以高效地进行光标移动、复制、粘贴、删除等操作。2.1 光标移动语法形式按键语法h向左移动j向下移动k向上移动l向右移动gg跳转到文件第一行GShiftg跳转到文件最后一行nG或nShiftg跳转到第 n 行0或^Shift6移动到行首$Shift4移动到行尾w以单词为单位向后移动b以单词为单位向前移动数字前缀技巧h、j、k、l、w、b前面都可以加数字表示重复执行多次。例如8h表示向左移动 8 个字符3w表示向后移动 3 个单词。功能在命令模式下快速移动光标位置无需鼠标即可精准定位到文件的任意位置。示例——演示 h/j/k/l 基本方向移动bash# 打开一个多行文件 vim test.txt # 在命令模式下 h # 光标向左移动一个字符 j # 光标向下移动一行 k # 光标向上移动一行 l # 光标向右移动一个字符 # 组合使用先按 5再按 j光标会向下移动 5 行 5j为什么是 h/j/k/l这是 Vim 前身 Vi 的历史遗留。在早期的键盘上这四个键刚好排成一排右手放置区域比方向键更高效。j键上有一个小凸起主页键所以它代表当前行向下k在j上面代表上一行。——演示 gg / G / nG 文件跳转bash# 假设 test.txt 有 100 行内容 gg # 光标瞬间跳到第 1 行行首 G # 光标瞬间跳到第 100 行最后一行行首 15G # 光标跳到第 15 行行首 1G # 等同于 gg跳到第一行实用场景当你在调试代码时编译器报错第 42 行有语法错误你可以直接用42G跳转到第 42 行比滚动鼠标快得多——演示 0 / ^ / $ 行内跳转bash# 假设当前行内容为 Hello World 0 # 光标移到当前行的最开头第 0 列 ^ # 光标移到当前行第一个非空白字符类似 0但跳过行首空格 $ # 光标移到当前行的末尾——演示 w / b 单词级跳转bash# 假设当前行内容为Hello World Vim Linux w # 光标从 Hello 跳到 World 的首字母 w # 再按一次跳到 Vim 的首字母 w # 再按一次跳到 Linux 的首字母 b # 往回跳回到 Vim b # 再往回跳回到 World 3w # 一次向后跳 3 个单词2.2 复制、粘贴与删除语法形式按键语法yy复制当前整行p在光标下方粘贴dd剪切删除当前整行u撤销上一步操作Ctrlr恢复撤销重做x删除光标位置的字符向右删Shiftx删除光标左侧的字符向左删数字前缀技巧yy、p、dd、x前面都可以加数字表示操作多行/多字符。例如3yy复制 3 行5dd删除 5 行10x删除 10 个字符。功能在命令模式下快速完成文本的复制、粘贴、删除和撤销操作无需 CtrlC / CtrlV。示例——演示 yy / p 复制粘贴bash# 假设文件内容如下 # 第1行AAA # 第2行BBB # 第3行CCC # 光标在第1行按 yy 复制当前行 yy # 按 p 粘贴内容会粘贴到当前行的下一行 p # 结果 # 第1行AAA # 第2行AAA ← 新粘贴的 # 第3行BBB # 第4行CCC # 复制多行3yy 复制从当前行开始的 3 行 3yy # 粘贴 p新手注意Vim 的p粘贴是在当前行的下方粘贴整行内容。如果你用x删除的是单个字符p会在光标右侧粘贴单个字符。粘贴行为会根据复制/删除的内容类型自动适配。——演示 dd 删除行bash# 假设文件内容如下 # 第1行AAA # 第2行BBB # 第3行CCC # 光标在第2行按 dd 删除当前行 dd # 结果 # 第1行AAA # 第2行CCC ← 原来的第3行上移 # 删除多行5dd 删除从当前行开始的 5 行 5dd重要区别dd本质上是剪切操作被删除的内容存在寄存器中按p可以粘贴出来如果你只是想删除而不想保留内容用dd后不粘贴即可。——演示 x / Shiftx 删除字符bash# 假设当前行内容为Hello # 光标在 H 上 x # 删除 H变成 ello光标停在 e 上 x # 再删 e变成 llo # 光标在 llo 的第一个 l 上 Shiftx # 删除光标左侧的字符但左侧没有字符所以无变化 # 光标移到 o 上 Shiftx # 删除 o 左侧的 l变成 lo——演示 u / Ctrlr 撤销与恢复bash# 假设你刚才执行了 dd 删除了一行 u # 撤销刚才的删除被删除的行回来了 # 你觉得删错了想恢复删除 Ctrlr # 重做行又被删除了 # 可以连续按 u 撤销多步操作 u # 再撤销一步 u # 再撤销一步 # 可以连续按 Ctrlr 恢复多步 Ctrlr # 恢复一步类比理解u就像 Windows 里的CtrlZ撤销Ctrlr就像CtrlY重做。但注意Vim 中的u只在本次编辑会话中有效一旦:wq保存退出就不能再撤销了。2.3 替换操作语法形式按键语法r 新字符替换光标处的单个字符Shiftr进入替换模式连续覆盖替换Shift~光标处字符大小写互换功能在命令模式下快速修改字符无需进入插入模式。适合小范围的字符修改。示例——演示 r 替换单个字符bash# 假设当前行内容为Hello # 光标在 H 上按 r 再按 W r W # H 被替换为 W变成 Wello # 光标移到 e 上按 r 再按 a r a # e 被替换为 a变成 Wallo使用场景当你只需要改一个字符时用r比进入插入模式再退出来回切换快得多。——演示 Shiftr 进入替换模式bash# 假设当前行内容为Hello World # 光标在 W 上按 Shiftr # 左下角出现 -- REPLACE -- 字样 # 输入 Vim # World 被逐字符覆盖为 Vimld Shiftr # 输入Vim # 结果Hello Vimld # 按 Esc 退出替换模式回到命令模式——演示 Shift~ 大小写互换bash# 假设当前行内容为Hello # 光标在 H 上按 Shift~ Shift~ # H → h变成 hello光标自动右移到 e # 再按 Shift~ Shift~ # e → E变成 hEllo光标右移到 l # 连续按可以快速转换大小写2.4 可视模式批量操作语法形式按键语法Ctrlv进入块可视模式V-BLOCKShifti选中区域后进入插入模式批量插入d选中区域后批量删除功能可视模式允许你选中一个矩形块区域然后对选中的区域进行批量操作插入、删除等。这是 Vim 最强大的功能之一特别适合批量注释/取消注释代码。示例——演示 Ctrlv 批量注释代码最常用这是 Vim 中最实用的技巧之一在写代码时几乎天天都会用到bash# 假设有以下 C 语言代码需要注释掉 # int a 1; # int b 2; # int c 3; # 步骤 1光标移到第一行行首按 Ctrlv 进入块可视模式 Ctrlv # 步骤 2按 j或方向键向下移动选中这三行的行首区域 jj # 选中 3 行 # 步骤 3按 Shifti 进入插入模式 Shifti # 步骤 4输入注释符号 // // # 步骤 5按 Esc 键可能需要按两次 Esc # 结果三行代码全部被注释掉 # //int a 1; # //int b 2; # //int c 3;新手必学这个批量注释技巧非常实用以后你在写 C/C 代码时注释多行代码再也不用一行一行加了。记住这个流程Ctrlv→ 选中 →Shifti→ 输入内容 →Esc。——演示 Ctrlv 批量删除注释bash# 假设有以下已注释的代码 # //int a 1; # //int b 2; # //int c 3; # 步骤 1光标移到第一行的第一个 / 上按 Ctrlv Ctrlv # 步骤 2按 j 向下选中 3 行的两个 / 字符 jj # 选中 3 行 # 步骤 3按 d 删除选中的 // d # 结果注释符号被删除代码恢复 # int a 1; # int b 2; # int c 3;2.5 查找语法形式按键语法#Shift3逆向查找光标所在的单词*Shift8顺向查找光标所在的单词n跳转到下一个匹配项NShiftn跳转到上一个匹配项功能在命令模式下快速查找文件中的指定单词按n/N在匹配项之间跳转。示例——演示 # / * / n 快速查找单词bash# 假设文件内容如下 # int main() { # int a 10; # int b 20; # int c a b; # return 0; # } # 光标移到第 3 行的 int 上 # 按 # 逆向查找往上找 int # 光标跳到第 2 行的 int # 按 n 继续往上找 # 光标跳到第 1 行的 intmain 的 int # 按 * 顺向查找往下找 int # 光标跳到第 2 行的 int # 按 n 继续往下找 # 光标跳到第 3 行的 int # 按 n 再往下找 # 光标跳到第 4 行的 int实用场景在阅读源代码时你想知道某个变量在哪些地方被使用了把光标放在变量名上按#或*就能快速定位所有出现的位置。三、底行模式操作底行模式也叫命令行模式通过在命令模式下按:进入主要用于保存、退出、替换、分屏等高级操作。这个模式的命令以回车键结束。3.1 保存与退出语法形式命令语法:w保存文件不退出:q退出 Vim不保存:wq保存并退出:q!强制退出不保存修改:w!强制保存功能控制文件的保存和 Vim 的退出。这是每次使用 Vim 都会用到的操作。示例——演示 :w / :q / :wq / :q! 各种保存退出方式bash# 场景 1修改了文件想保存并退出 :wq # 保存修改并退出 Vim # 场景 2修改了文件但发现改错了想放弃修改直接退出 :q! # 强制退出不保存任何修改 # 场景 3文件修改到一半想先保存但不退出边写边存是个好习惯 :w # 只保存不退出继续编辑 # 场景 4文件是只读的但你确实需要强制保存 :w! # 强制保存需要相应权限 # 场景 5没有修改文件只是查看了一下想直接退出 :q # 直接退出如果没有修改的话新手避坑初学者最常遇到的问题是改了文件但不知道怎么退出。记住先按Esc回到命令模式再按:wq保存退出。如果改错了不想保存就按:q!强制退出。——演示组合命令 :wq 的含义bash# :wq 其实是 :w保存和 :q退出的组合 # 你也可以分两步操作 :w # 先保存 :q # 再退出 # 效果等同于 :wq # 但 :wq 更简洁日常使用更方便3.2 行号显示语法形式命令语法:set nu或:set number显示行号:set nonu取消显示行号功能在 Vim 中开启/关闭行号显示。开启后每行前面会显示行号方便定位。示例——演示 :set nu 显示和隐藏行号bash# 打开一个文件 vim test.txt # 在命令模式下按 : 进入底行模式 :set nu # 显示行号 # 文件内容会变成 # 1 Hello, Vim! # 2 I am learning Linux. # 3 This is line 3. # 取消行号 :set nonu # 行号消失 # 简写形式 :set nu # 等同于 :set number永久显示行号每次打开文件都要手动:set nu太麻烦了。你可以修改 Vim 配置文件让它默认显示行号bash# 编辑 Vim 配置文件 vim ~/.vimrc # 在文件中添加一行 set nu # 保存退出后以后打开 Vim 就会自动显示行号了3.3 批量替换语法形式:%s/旧内容/新内容/g部分含义:%s对整个文件进行替换substitute/旧内容/要被替换的文本/新内容/替换后的文本/gglobal表示全局替换一行中出现多次都替换功能将文件中所有匹配的旧内容替换为新内容类似于 Windows 编辑器中的查找并替换全部。示例——演示 :%s 全文替换bash# 假设文件内容如下 # int a 10; # int b 10; # int c 10; # 把所有的 10 替换为 20 :%s/10/20/g # 结果 # int a 20; # int b 20; # int c 20;——演示不带 g 的替换效果对比bash# 假设当前行内容为int a 10, b 10, c 10; # 不加 g只替换每行第一个匹配项 :%s/10/20/ # 结果int a 20, b 10, c 10; # ↑只换了第一个 # 加 g替换每行所有匹配项 :%s/10/20/g # 结果int a 20, b 20, c 20; # 全部都换了延伸用法如果你只想替换某几行可以指定行号范围bash# 只替换第 2 到第 5 行中的 old 为 new :2,5s/old/new/g # 只替换当前行 :s/old/new/g3.4 分屏操作语法形式命令语法:vs 文件名垂直分屏打开另一个文件:sp 文件名水平分屏打开另一个文件Ctrlw w在分屏之间切换光标:q关闭当前分屏功能在 Vim 中同时打开多个文件以分屏的方式并排显示。方便对照参考、复制粘贴。示例——演示 :vs 垂直分屏编辑bash# 打开第一个文件 vim test.txt # 在命令模式下垂直分屏打开第二个文件 :vs config.txt # 现在屏幕被分成左右两半 # ┌─────────────┬─────────────┐ # │ test.txt │ config.txt │ # │ │ │ # │ 文件内容 │ 文件内容 │ # │ │ │ # └─────────────┴─────────────┘ # 按 Ctrlw w 在两个窗口间切换光标 Ctrlw w # 光标从左边跳到右边 Ctrlw w # 光标从右边跳回左边 # 在右边的窗口编辑 config.txt # 编辑完后光标在哪个窗口:q 就关闭哪个窗口 :q # 关闭当前窗口实用场景当你需要参照一个文件来修改另一个文件时分屏功能非常有用。比如你在写代码时可以左边打开头文件.h右边打开源文件.c对照编写。3.5 执行外部命令语法形式命令语法:!命令不退出 Vim 直接执行 Shell 命令功能在 Vim 中直接执行 Linux 命令无需退出 Vim。执行完成后按回车返回 Vim。示例——演示 :! 在 Vim 中执行 Shell 命令bash# 正在 Vim 中编辑代码想查看当前目录下有哪些文件 :!ls # 输出结果会显示在屏幕上按任意键返回 Vim # test.txt config.txt src/ # 想编译刚才写的 C 代码 :!gcc test.c -o test # 想查看当前日期时间 :!date # 想查看文件内容 :!cat test.txt实用场景在 Vim 中写完代码后不必退出 Vim直接:!gcc main.c -o main编译如果有错误就回到 Vim 修改非常高效四、Vim 使用小技巧4.1 打开和创建文件语法形式bashvim 文件名功能如果文件存在则打开该文件如果文件不存在则创建一个新文件在:wq保存退出后文件才真正创建。示例——演示用 vim 创建和打开文件bash# 打开已存在的文件 vim test.txt # 创建新文件文件原来不存在 vim newfile.txt # 进入后按 i 输入内容然后 :wq 保存退出 # 文件就被创建了 # 如果创建后没有保存就 :q! 退出文件不会被创建 vim newfile.txt :q! # 文件不会被创建 ls # 看不到 newfile.txt4.2 打开文件并定位到指定行语法形式bashvim 数字 文件名功能打开文件后光标直接定位到指定行号。在调试代码时特别有用。示例——演示 vim 行号 快速定位bash# 打开 test.txt 并将光标定位到第 15 行 vim 15 test.txt # 实际应用场景编译报错 test.c:42:5: error: ... # 直接跳到第 42 行查看 vim 42 test.c效率技巧结合编译器的报错信息用vim 行号 文件名可以一步到位跳到错误行省去了打开文件后再42G跳转的步骤。4.3 快捷打开最近编辑过的文件语法形式bash!v功能在 Shell 命令行中快速打开最近一个以v开头的命令通常是vim省去重复输入。示例——演示 !v 快捷打开bash# 假设你刚才执行过 vim test.txt # 现在又想用 vim但懒得打全名 !v # Shell 会自动补全为最近执行的 vim 命令 # 等同于再次执行 vim test.txt原理说明!是 Shell 的历史命令调用符!v表示执行最近一条以 v 开头的命令。如果你的上一条 vim 命令是vim test.txt那!v就等于vim test.txt。这是 Shell 的功能不是 Vim 的功能哦五、注意事项5.1 撤销操作的限制注意事项撤销操作 u 只在本次编辑会话中有效。 一旦 :wq 保存退出下次打开就不能撤销之前的修改了。建议养成边写边保存的习惯:w但也注意不要保存错误的修改。如果不小心改错了在保存之前用:q!强制退出可以放弃所有修改。5.2 数字前缀的妙用注意事项几乎所有的 Vim 命令前面都可以加数字表示重复执行。 这是一个非常强大的特性熟练运用可以大幅提升效率。操作效果3yy复制 3 行5dd删除 5 行10x删除 10 个字符8j向下移动 8 行3w向后移动 3 个单词2p粘贴 2 次5.3 Esc 键是你的好朋友注意事项无论你在什么模式按 Esc 都能回到命令模式。 当你不确定自己在什么模式时先按几下 Esc 准没错。新手口诀迷路按 Esc保命按 :q!。只要记住这两条你在 Vim 里就不会出不来了。六、新手常见坑⚠️避坑指南这些都是我当年踩过的坑你们别再踩了坑1我怎么输入不了字原因你在命令模式当然输入不了解决按i进入插入模式就能输入了。 记住Vim默认是命令模式不是输入模式这是新手最容易犯的错误。坑2我怎么退不出去Vim了原因不知道怎么退出急得团团转...解决连按几下Esc确保在命令模式然后输入:wq保存退出或者:q!强制退出。 说个笑话Stack Overflow上有个问题叫怎么退出Vim有几百万浏览量可见多少人被这个问题困扰过...坑3我按了u怎么撤销不了原因你已经保存退出过了撤销只在本次编辑有效。解决没保存之前赶紧u保存了就真的找不回来了...坑4我乱按了一通文件怎么变样了原因命令模式下每个字母都是命令乱按会执行各种操作。解决慌了就按Esc然后按u撤销实在不行就:q!强制退出不保存。坑5大小写分不清Vim里大小写是完全不同的命令比如g和G完全不一样w和W也不一样x和X也不一样 记住Shift按没按是两个完全不同的命令七、常用命令速查表为了方便大家复习这里整理一张完整的速查表命令模式速查分类按键功能光标移动hjkl左/下/上/右gg跳到文件开头G跳到文件末尾nG跳到第 n 行0/^跳到行首$跳到行尾w/b后/前移动一个单词复制粘贴yy复制当前行p粘贴到下一行删除dd删除当前行x删除光标字符Shiftx删除光标左侧字符撤销u撤销Ctrlr恢复撤销替换r替换单个字符Shiftr进入替换模式Shift~大小写互换可视模式Ctrlv块选择查找#/*逆向/顺向查找n/N下一个/上一个底行模式速查命令功能:w保存:q退出:wq保存并退出:q!强制退出:set nu显示行号:set nonu取消行号:%s/old/new/g全文替换:vs 文件名垂直分屏:!命令执行外部命令八、总结本篇我们学习了 Vim 编辑器的基本使用核心内容回顾三大模式命令模式默认、插入模式编辑、底行模式保存退出等模式切换是 Vim 的核心概念命令模式光标移动hjkl、gg、G、复制粘贴yy、p、删除dd、x、撤销u、Ctrlr、替换r、可视模式Ctrlv、查找#、n底行模式保存退出:wq、行号:set nu、替换:%s、分屏:vs、外部命令:!实用技巧vim 行号 文件名快速定位、数字前缀重复操作、批量注释代码最后说两句Vim这东西光看没用一定要多练刚开始可能觉得别扭甚至觉得这玩意儿谁发明的反人类但坚持用一周你就会发现——真香我是你们的CSDN博主小小风呀我们下篇见~ 如果觉得有帮助别忘了点赞收藏关注三连哦下一篇我们将学习Linux 编译器 gcc/g 的使用敬请期待专栏目录第一篇Xshell 连接腾讯云服务器第二篇Linux 基本指令入门第三篇Linux 文件与目录管理第四篇Vim 编辑器的基本使用本文第五篇gcc/g 编译器的使用敬请期待...