
能从冰封的土地里
培育出十万朵怒放的蔷薇
Linux 系统篇(七 ) —— vim编辑器详解
文章目录
1. vi 与 vim
很多人会问:vi 和 vim 到底是不是一回事?
简单地说,vim 是 vi 的超级加强版。 vi是 Unix 系统早期就有的标准文本编辑器,几乎每个类 Unix 系统都自带。后来 Bram Moolenaar 在 vi 的基础上开发了 vim(即“改进版 vi”),它不仅完全兼容 vi 的所有指令,还加入了很多现代编辑器才有的特性。
2. Vim 的核心设计
Vim 是一款多模式编辑器,同一个按键在不同模式下功能完全不同。
2.1 三种必会模式
我们主要讲解 三种核心模式:
| 模式名称 | 英文名 | 功能定位 | 通俗理解 |
|---|---|---|---|
| 命令模式(正常/普通模式) | Normal mode | 控制光标移动、删除、复制、粘贴,以及进入其他模式 | “指挥官模式”,一切操作的司令部 |
| 插入模式 | Insert mode | 真正输入、修改文字 | “打字模式”,键盘上的字母会变成文档内容 |
| 底行模式 | Last line mode | 执行保存、退出、查找、替换、设置等命令 | “命令行模式”,窗口最底下一行输入指令 |
当你打开 Vim 时,默认进入的就是命令模式。
2.2 模式切换一览
从命令模式出发,可以切换到其他任何模式。按 Esc 键则可以从任何模式返回命令模式。

2.3 其他模式简介
- 替换模式:按
Shift + r(即大写R)进入,输入的字符会覆盖光标位置的原有内容,而不是插入。适合修正小段文字。 - 可视模式:按
v进入字符选择,按V进入行选择,按Ctrl + v进入列块选择(矩形区域)。选定后可以批量删除、复制、缩进等。
3. Vim 基本操作:打开、切换、退出
3.1 用 Vim 打开文件
$ vim test.c
回车后,你会看到全屏幕的 Vim 界面。如果 test.c 不存在,Vim 会新建一个空白缓冲区,等你保存时再创建文件。此时你处于命令模式,直接敲键盘不会输入任何文字。
3.2 模式切换第一步:进入插入模式
从命令模式切换到插入模式,有三种最基础的方式:
| 按键 | 功能 |
|---|---|
i | 在光标当前位置前开始插入 |
a | 在光标当前位置的下一个位置(即光标后)开始插入 |
o | 在当前行下方新开一行,并定位到行首开始插入 |
这三个按键是使用频率最高的进入插入模式的命令。
补充:
| 按键 | 功能 |
|---|---|
Shift + i(即 I) | 跳到当前行的行首(第一个非空字符处)并进入插入模式 |
Shift + a(即 A) | 跳到当前行的行尾并进入插入模式 |
3.3 回到命令模式
输入完后,如果你想退出插入模式。按 Esc 键即可返回命令模式,左下角的 -- INSERT -- 会消失。
3.4 退出 Vim
在命令模式下,按 :(Shift + ;)进入底行模式,光标会跑到屏幕最下方。你可以输入:
| 命令 | 作用 |
|---|---|
:w | write,保存当前文件但不退出 |
:q | quit,退出 Vim(如果文件修改过没保存,会报错不让退) |
:wq | 保存并退出 |
:q! | 强制退出,不保存修改(当你一通乱改想直接跑路时) |
:x | 保存并退出(功能同 :wq,文件未修改时不会更新时间戳) |
另外,命令模式下还有一个不需要冒号的快捷退出方式:ZZ(大写 Z 按两次),同样是保存并退出。
4. 命令模式(正常模式)命令全集
4.1 进入插入模式
前面已经介绍了 i、a、o、I、A。这里再补充一个:
| 按键 | 功能 |
|---|---|
Shift + o(即 O) | 在当前行上方新开一行,并进入插入模式 |
这样,你就有了从当前位置、行首、行尾、上行、下行等各个角度开始输入文字的本领。
4.2 光标移动
Vim 的设计方向之一就是尽量不离开键盘主区,所以它推荐使用 h、j、k、l 四个字母键来移动光标,替代方向键。
为什么这么设计?因为在 Vim 诞生的年代,某些键盘根本没有独立的方向键;而且手指不移动可以更快。

除了单步移动,你还可以在它们前面加数字:5j 表示向下移动 5 行,10l 表示向右移动 10 个字符。
行内快速移动
| 按键 | 功能 |
|---|---|
^ (Shift + 6) | 移动到本行第一个非空白字符(即行首内容) |
$ (Shift + 4) | 移动到本行行尾 |
0(数字零) | 移动到本行绝对行首(包括空白) |
单词级移动
| 按键 | 功能 | 英文 |
|---|---|---|
w | 光标跳到下一个单词的开头 | word |
b | 光标跳回上一个单词的开头 | backward |
e | 光标跳到当前(或下一个)单词的结尾 | end |
组合数字:3w 就是往后跳 3 个单词。
页级翻屏
| 按键 | 功能 |
|---|---|
Ctrl + f | 屏幕向前翻一页(forward) |
Ctrl + b | 屏幕向后翻一页(backward) |
Ctrl + d | 屏幕向下翻半页(down) |
Ctrl + u | 屏幕向上翻半页(up) |
文件首尾跳转
| 按键 | 功能 |
|---|---|
gg | 快速跳到文件开头 |
G (Shift + g) | 快速跳到文件末尾 |
ngg 或 nG | 跳转到第 n 行,如 15G 跳到第 15 行行首 |
另外,按 Ctrl + g 可以在底部显示当前文件名、总行数、当前行号以及当前位置的百分比。
4.3 删除文字
| 按键 | 功能 |
|---|---|
x | 删除光标所在位置的一个字符(相当于 Delete 键) |
X (Shift + x) | 删除光标前面的一个字符(相当于 Backspace 键) |
nx 或 nX | 连续删除 n 个字符,如 6x 删除从光标开始(含)向后 6 个字符;20X 删除光标前 20 个字符 |
dd | 剪切(删除)光标所在一整行 |
ndd | 从当前行开始,向下连续删除 n 行,例如 3dd 删除 3 行 |
dw | 删除从光标到当前单词结尾的字符(包括空格) |
d$ 或 D | 删除从光标到行尾 |
d^ | 删除从光标到行首(非空白处) |
理解:d 是“删除”的动作,后面跟的字母表示“范围”。例如 dw 可以读作“删除一个单词(word)”
dd 其实是把整行内容放进了“剪贴板”(Vim 里叫寄存器),所以你删掉的这一行,一会儿用 p 还能粘贴回来,相当于“剪切”操作。
4.4 复制与粘贴
| 按键 | 功能 |
|---|---|
yy | 复制光标所在整行 |
nyy | 复制从当前行开始的 n 行,如 6yy 复制 6 行 |
yw | 复制从光标到当前单词结尾的字符 |
nyw | 复制 n 个单词 |
y$ | 复制从光标到行尾 |
y^ | 复制从光标到行首 |
p | 粘贴到光标所在位置的下方(如果复制的是整行);如果是单词或字符则粘贴到光标后 |
P (Shift + p) | 粘贴到光标所在位置的上方(整行),或光标前(字符) |
关键规则:所有复制命令(y 系列)都必须与粘贴命令 p(或 P)配合使用,才能完成“复制–粘贴”的全流程。
4.5 替换与更改
| 按键 | 功能 |
|---|---|
r | 替换光标所在的一个字符。按下 r 后再输入一个新字符,原字符就被替换了,然后自动回到命令模式。 |
nr | 从光标起,连续替换 n 个字符为同一个新字符。例如 5r* 会将后面 5 个字符都变成星号。 |
R (Shift + r) | 进入替换模式,从此你输入的内容会逐个覆盖光标位置的原有字符,直到按 Esc 退出。适合修改一整段内容。 |
cw | 更改(change) 从光标到单词结尾的内容。Vim 会先删除这些字符,然后自动进入插入模式等你输入新内容。 |
cnw | 更改 n 个单词,如 c3w 删除光标后的 3 个单词并进入插入模式。 |
c$ 或 C | 更改从光标到行尾的内容。 |
~ (Shift + ~) | 切换光标下字符的大小写,并按一下向右移动一格。 |
c 系列命令可以理解为“先删除后插入”,它比单纯删除再按 i 更快捷。
4.6 撤销与重做
| 按键 | 功能 |
|---|---|
u | 撤销上一步操作。可以连续按多次,一步步往回退。 |
Ctrl + r | 重做刚才被撤销的操作,也就是“撤销的撤销”。 |
重要提醒:
- 一旦你退出 Vim(执行了
:q或关闭终端),所有撤销历史都会被清空。下次再打开这个文件,你将无法用u恢复到上一次编辑时的状态。 - 如果你只保存了文件(
:w)而没有退出 Vim,那么撤销历史依然完整可用,你可以继续按u回到保存前的某个状态。
4.7 其他实用命令
这里补充几个高频率命令:
| 按键 | 功能 |
|---|---|
. (句点) | 重复上一次的修改操作。比如你刚刚用 dd 删了一行,移动光标后按 . 就会再删一行。 |
J (Shift + j) | 将下一行合并到当前行末尾,中间加一个空格。 |
>> 和 << | 当前行向右/向左缩进一个 shiftwidth 的距离。 |
* 和 # (Shift + 3) | * 查找光标所在的单词(向下查找),# 向上查找。所有匹配项会被高亮显示,按 n 继续找下一个。 |
4.8 可视块模式(Visual Block)批量操作
进入可视块模式
在命令模式下,按下 Ctrl + v,左下角会显示 -- VISUAL BLOCK --,表示已进入可视块模式。
理解:进入该模式后,你依然可以像在命令模式下那样移动光标(h/j/k/l、G、数字G、w 等),只不过此时光标移动所覆盖的矩形区域会被高亮选中。简单说:你的光标走到哪里,矩形选区就画到哪里。
批量添加注释(最常用场景)
假设你要给下面这几行代码批量加上 // 注释:
int a = 1;
int b = 2;
int c = 3;
操作步骤如下:
- 定位:将光标移动到第一行
int的i上(即你要插入注释符号的列位置)。- 进入可视块模式:按下
Ctrl + v。- 选中目标行:连续按
j(或2j)向下选中 3 行。你会发现,光标所过的每一行都在同一列位置被高亮成了一个细长矩形。- 进入块插入模式:按下
Shift + i(即大写I)。此时你会发现只有第一行出现了闪烁的光标,其他行暂时变暗。- 输入注释符号:键入
//(或#,根据你的语言)。- 应用修改:按下
Esc键。Vim 会瞬间将你输入的//添加到刚才选中的每一行的相同列位置,效果如下:
//int a = 1;
//int b = 2;
//int c = 3;
总结可视块模式常用步骤
| 操作 | 按键序列 |
|---|---|
| 进入块模式 | Ctrl + v |
| 选中矩形区域 | 用 h/j/k/l、G 等移动光标 |
| 在块前插入相同内容 | Shift + i -> 输入文字 -> Esc |
| 在块后追加相同内容 | Shift + a(大写 A)-> 输入文字 -> Esc |
| 删除块内容 | d 或 x |
| 复制块内容 | y |
| 粘贴块 | 移动光标后 p |
5. 底行模式命令集
底行模式让 Vim 变得像一个命令行驱动的编辑器,它处理文件级别的操作。使用前请确保你已经按 Esc 回到命令模式,然后输入 :(冒号),底行出现光标等待命令。
5.1 保存与退出
前面已经列过基础命令,这里再整理一遍,加上了一些细节:
| 命令 | 说明 |
|---|---|
:w | 保存文件(写入磁盘) |
:w 文件名 | 另存为新文件,类似“另存为” |
:q | 退出 Vim(若文件修改过会警告) |
:q! | 强制退出,丢弃所有修改 |
:wq | 保存并退出 |
:x | 保存并退出,若内容未变则不更新文件时间戳 |
:wqa | 保存所有标签页/分屏并退出 |
另外,命令模式下的 ZZ 等价于 :wq,ZQ 等价于 :q!。
5.2 显示与取消行号
| 命令 | 效果 |
|---|---|
:set nu | 在每一行前面显示行号 |
:set nonu | 取消行号显示 |
这个设置在本次 Vim 会话中有效,关闭后失效。
5.3 跳转到指定行
在底行模式下,直接输入一个数字并回车,光标就会跳到该行行首。
例如:
:15
光标立刻跳转到第 15 行。
5.4 查找字符串
| 命令 | 功能 |
|---|---|
/关键字 | 向下查找“关键字”。按回车后,光标跳到第一个匹配项。 |
?关键字 | 向上查找“关键字”。 |
找到第一个匹配后,你可以用以下按键在结果间跳转:
| 按键 | 功能 |
|---|---|
n | 跳到下一个匹配项(与查找方向相同:/ 则向下,? 则向上) |
N (Shift + n) | 跳到上一个匹配项(与查找方向相反) |
/ 和 ? 的本质区别:/ 是从光标位置向文件末尾方向搜索;? 是从光标位置向文件开头方向搜索。
5.5 全局替换
基本语法:
:[range]s/old/new/[flags]
range:作用范围,%表示全文,也可以用1,10表示第 1 到第 10 行。s:substitute(替换)。old:要替换掉的原始文本。new:新的文本。flags:修饰符,常用g(global,一行内所有匹配都替换,否则只替换每行的第一个匹配),c(confirm,每次替换前询问)。
最常用命令:
:%s/hello/hi/g
将全文中所有 hello 替换为 hi。
如果你想每次替换前都确认一下,可以:
:%s/foo/bar/gc
Vim 会在每个匹配处停下,等你按 y(替换)或 n(跳过)等。
5.6 执行外部命令与分屏
| 命令 | 功能 |
|---|---|
:! 命令 | 临时退出 Vim 去执行一条 shell 命令,执行完毕后按回车返回 Vim。例如 :!ls -l 查看当前目录文件。 |
:vs 文件名 | 垂直分屏,在右侧打开另一个文件(若文件不存在则新建)。使用 Ctrl + ww 可以来回切换光标所在的界面,命令行中的命令是对光标所在的文件执行的 。 |
6. Vim 操作总结
命令模式常用指令速记
| 类别 | 命令 | 含义 |
|---|---|---|
| 移动 | h j k l | 左 下 上 右 |
| 单词 | w b e | 下一词首、上一词首、词尾 |
| 行内 | 0 ^ $ | 绝对行首、行首文字、行尾 |
| 文件 | gg G nG | 文件头、文件尾、第 n 行 |
| 翻页 | Ctrl+f/b/d/u | 向前/后页,向前/后半页 |
| 插入 | i a o I A O | 光标前/后/下行/行首/行尾/上行插入 |
| 删除 | x X dd dw D | 删一字/前一字/整行/一词/至行尾 |
| 复制 | yy yw y$ | 复制行/词/至行尾 |
| 粘贴 | p P | 粘贴到后/前 |
| 替换 | r R ~ | 替换单字/替换模式/大小写切换 |
| 更改 | cw c$ C | 改一词/至行尾/至行尾 |
| 撤销 | u Ctrl+r | 撤销/重做 |
| 查找 | * # | 向下/向上查找当前词 |
底行模式常用指令速记
| 命令 | 作用 |
|---|---|
:w | 保存 |
:q | 退出 |
:wq / :x | 保存并退出 |
:q! | 强制退出 |
:set nu / :set nonu | 显示/取消行号 |
:数字 | 跳到指定行 |
/词 | 向下查找 |
?词 | 向上查找 |
n / N | 下一个/上一个匹配 |
:%s/old/new/g | 全文替换 |
:vs 文件 | 垂直分屏 |
:!命令 | 执行外部命令 |
7. 简单 Vim 配置
Vim 的外观和行为可以通过配置文件进行定制。
7.1 配置文件位置
Vim 有两级配置:
- 系统级配置:
/etc/vimrc(或/etc/vim/vimrc)。里面的设置对所有用户生效。修改它通常需要 root 权限。- 用户级配置:用户主目录下的
.vimrc文件,如/root/.vimrc或/home/你的用户名/.vimrc。这是你自己的私人配置,修改后只会影响你本人。
一般情况下,我们只动自己家目录下的 .vimrc。如果这个文件不存在,新建一个即可。
7.2 常用配置选项
打开 ~/.vimrc,添加以下几行,保存后重启 Vim 即可看到效果。
" 启用语法高亮(代码关键字彩色显示)
syntax on
" 在每一行左侧显示行号
set number
" 设置按下 Tab 键时显示的空白宽度为 4 个空格
set tabstop=4
" 设置自动缩进和退格时使用的空格数为 4
set shiftwidth=4
" 在插入模式下,按 Tab 键插入空格而不是制表符(这样代码缩进不会因不同编辑器而异)
set expandtab
" 设置软制表符宽度:当 expandtab 开启时,按一次 Tab 插入 4 个空格
set softtabstop=4
" 高亮显示当前行(便于定位光标在哪一行)
set cursorline
" 显示右下角的行列信息,如“12,5”表示第12行第5列
set ruler
" 输入下面符号时自动补齐另一半
inoremap ' ''<ESC>i
inoremap " ""<ESC>i
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
inoremap { {<CR>}<ESC>O
结语:
今天的内容到这里就结束了,希望你能有所收获~
干货整理到手抖,觉得有用的话,赏个三连回回血?__(:ᗤ」ㄥ)_ _
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/Huang_jin007/article/details/163136917




