Vim 完全指南:从零到精通的系统性学习手册
副标题:理解文本编辑的另一种思维方式
序言:为什么你需要阅读这篇文章
在计算机的世界里,文本编辑器是一个看似简单却又无比深邃的领域。大多数人终其一生都停留在”打开-打字-保存”的层面,从未真正思考过”编辑”这件事本身可以有怎样不同的哲学。
Vim 就是这种不同哲学的集大成者。它诞生于 1976 年的 Vi,成熟于 1991 年的 Vim,历经半个世纪的演进,至今仍是无数程序员、系统管理员、写作者的首选工具。不是因为它漂亮(它默认界面朴素得近乎寒酸),不是因为它易用(它的学习曲线陡峭得令人望而生畏),而是因为它高效——一种经过时间验证的、不可替代的效率。
这篇文章的目标,不是罗列命令让你背诵,而是带你理解 Vim 的设计思想,让你真正”懂”它,然后自然而然地”用”它。
第一篇:起源与哲学 —— Vim 从何而来,为何而生
第 1 章 历史的馈赠:从 Vi 到 Vim
要理解 Vim,我们必须回到 1976 年。那一年,贝尔实验室的 Bill Joy 在 ADM-3A 终端上开发了 Vi 编辑器。那个时代没有鼠标,没有图形界面,只有键盘和一个闪烁的光标。在这样的限制下,Vi 的设计者们创造出了一套纯粹基于键盘的文本操作体系。
1988 年,荷兰程序员 Bram Moolenaar 在 Amiga 计算机上开始了 Vim 的开发。他最初的目标只是”模仿 Vi”(Vim 最初即 Vi IMitation 的缩写),但随着功能的不断添加——语法高亮、多级撤销、分屏、插件系统——Vim 很快超越了 Vi,名字也改为了 Vi IMproved。
1991 年 11 月 2 日,Vim 1.14 首次公开发布。从那时起,Vim 开始了它长达三十多年的持续进化。直到今天,Bram Moolenaar 于 2023 年去世,Vim 的社区依然活跃,继续维护和更新着这份遗产。
第 2 章 设计哲学:三个核心原则
Vim 的设计背后,有一套深刻而自洽的哲学。理解这套哲学,比记住一百个命令更重要。
原则一:手不离键盘
这是 Vim 最表面也最根本的原则。在 Vim 的设计者看来,鼠标是一种打断——你的手需要离开键盘,移动到鼠标,移动光标,点击,然后再移回键盘。这个看似微小的动作,累积起来就是巨大的效率损耗。Vim 要让你的双手始终停留在键盘中央区域,用最少的移动完成最多的操作。
原则二:模式分离
Vim 认为,”输入文本”和”操作文本”是两件完全不同的事情。传统的编辑器将这两者混在一起——你在打字的同时,也可以按删除键删字。Vim 则明确区分了插入模式(只管打字)和普通模式(只管操控)。这种分离带来了一个巨大的好处:在普通模式下,每个按键都可以被赋予”命令”的含义,而不必担心与文本输入冲突。
原则三:组合优于记忆
这是 Vim 最聪明的设计。传统编辑器需要你记住大量复杂的快捷键(Ctrl+Shift+Alt+F 之类的),而 Vim 只提供少量基本”动词”和”名词”,让用户自由组合。你不需要记住”删除到行尾”的快捷键,你只需要知道”删除”是 d,”行尾”是 $,组合起来就是 d$。这种设计将记忆负担降至最低,将表达能力推至最高。
第二篇:入门与基础 —— 你的第一次 Vim 之旅
第 3 章 启动、界面与退出
启动 Vim
在终端中输入以下命令即可启动 Vim:
vim # 启动一个空白文件
vim filename.txt # 打开或创建 filename.txt
vim +10 filename.txt # 打开并直接跳转到第 10 行
vim +/keyword file # 打开并搜索 keyword
认识界面
Vim 启动后,你看到的是一片空白或文件内容,底部有一行状态栏。整个界面极其简洁——没有菜单栏,没有工具栏,只有文本和光标。
退出 Vim(新手的第一个挑战)
Vim 的退出方式常常让新手抓狂,但理解了模式概念后就很简单了:
| 命令 | 含义 |
|---|---|
:q | 退出(如果文件未修改) |
:q! | 强制退出,放弃所有修改 |
:wq 或 :x 或 ZZ | 保存并退出 |
:w | 仅保存,不退出 |
:w newname.txt | 另存为新文件 |
💡 新手提示:如果不小心进入了奇怪的状态,多按几次
Esc键,然后输入:q!回车,总能回到终端。
第 4 章 模式体系:Vim 的核心灵魂
Vim 有四种主要模式,这是理解一切操作的基础。
普通模式(Normal Mode)—— 默认状态
当你启动 Vim 时,就在普通模式中。在这个模式下,你按下的每个键都是一个命令,而不是字符。这是 Vim 的”指挥中心”,你在此模式下浏览、移动、删除、复制、执行各种操作。
插入模式(Insert Mode)—— 输入文字
在普通模式下按 i 进入插入模式。此时你输入的字符会直接插入到文本中,就像普通编辑器一样。完成输入后,按 Esc 回到普通模式。
可视化模式(Visual Mode)—— 选择文本
在普通模式下按 v 进入可视化模式。此时移动光标会高亮选中文本,然后可以对选中区域执行操作(如删除、复制、缩进)。按 Esc 回到普通模式。
命令行模式(Command-line Mode)—— 执行高级命令
在普通模式下按 : 进入命令行模式,底部会出现一个冒号,你可以输入命令(如 w 保存、q 退出、s/old/new 替换)。按回车执行命令,自动回到普通模式。
核心法则:永远在普通模式下思考,只在输入文字时短暂进入插入模式。
第三篇:操作体系 —— 理解 Vim 的”语法”
第 5 章 Vim 的基本语法:动词 + 名词 + 修饰语
这是 Vim 最精华的部分。理解了这一章,你就掌握了 Vim 百分之八十的威力。
语法结构
[修饰语] 动词 + [数字] 名词
动词(Verb):你想要执行的动作
| 动词 | 含义 |
|---|---|
d | 删除(delete)— 剪切 |
y | 复制(yank) |
c | 修改(change)— 删除并进入插入模式 |
v | 可视化选择(visual select) |
> | 向右缩进 |
< | 向左缩进 |
= | 自动格式化缩进 |
g~ | 切换大小写 |
gu | 转为小写 |
gU | 转为大写 |
名词(Noun):操作的对象
| 名词 | 含义 |
|---|---|
w | 单词(word) |
s | 句子(sentence) |
p | 段落(paragraph) |
b | 括号块(block,通常配合 ( 或 ) 使用) |
t | 标签(HTML 标签) |
' / " / ` | 引号内的内容 |
0 | 行首 |
$ | 行尾 |
G | 文件末尾 |
gg | 文件开头 |
修饰语(Modifier):精确指定范围
| 修饰语 | 含义 | 示例 |
|---|---|---|
i | inside(内部,不含边界) | di" → 删除双引号内的内容 |
a | around(包含边界) | da" → 删除包括双引号在内的内容 |
数字 | 重复次数 | y2w → 复制两个单词 |
t | 直到某个字符前 | dt, → 删除到逗号前 |
f | 找到某个字符 | df, → 删除到逗号(含逗号) |
实战组合示例
| 命令 | 解析 | 含义 |
|---|---|---|
dw | 删除 + 单词 | 删除当前光标到下一个单词结束 |
d2w | 删除 + 两个 + 单词 | 删除两个单词 |
di" | 删除 + 内部 + 引号 | 删除引号内的内容(保留引号) |
da" | 删除 + 包括边界 + 引号 | 删除引号及其内容 |
ci( | 修改 + 内部 + 括号 | 修改括号内的内容(删除并进入插入) |
y$ | 复制 + 行尾 | 复制到行尾 |
gg=G | 文件头 + 格式化 + 文件尾 | 自动格式化整个文件 |
vi( | 可视化 + 内部 + 括号 | 选中括号内的内容 |
d/hello | 删除 + 搜索到 hello | 删除到第一个 “hello” 出现的位置 |
第 6 章 移动命令:在文本中自由穿梭
移动是 Vim 中最频繁的操作,掌握移动命令是提升效率的第一步。
字符级移动
| 命令 | 含义 |
|---|---|
h | 左移一个字符 |
j | 下移一行 |
k | 上移一行 |
l | 右移一个字符 |
💡 为什么要用 hjkl 而不是方向键? 因为 hjkl 位于键盘中央区域,手指不需要离开”基准行”,而方向键在键盘边缘,每次移动都需要手部大范围移动。虽然初学别扭,但一旦习惯,速度提升明显。
单词级移动
| 命令 | 含义 |
|---|---|
w | 移动到下一个单词开头 |
W | 移动到下一个 WORD 开头(忽略标点) |
b | 移动到当前/上一个单词开头 |
B | 移动到当前/上一个 WORD 开头 |
e | 移动到单词末尾 |
E | 移动到 WORD 末尾 |
行级移动
| 命令 | 含义 |
|---|---|
0 | 移动到行首(绝对) |
^ | 移动到行首第一个非空字符 |
$ | 移动到行尾 |
g_ | 移动到行尾最后一个非空字符 |
+ / - | 移动到下一行/上一行的行首非空字符 |
文件级移动
| 命令 | 含义 |
|---|---|
gg | 移动到文件开头 |
G | 移动到文件末尾 |
数字G | 移动到第 N 行(如 10G 到第 10 行) |
:数字 | 移动到第 N 行(如 :10 回车) |
Ctrl + f | 向前翻一页 |
Ctrl + b | 向后翻一页 |
Ctrl + d | 向前翻半页 |
Ctrl + u | 向后翻半页 |
% | 跳到匹配的括号 (){}[] |
[[ / ]] | 跳到上一个/下一个代码块 |
搜索移动
| 命令 | 含义 |
|---|---|
/pattern | 向下搜索 pattern |
?pattern | 向上搜索 pattern |
n | 跳到下一个匹配 |
N | 跳到上一个匹配 |
* | 搜索当前光标下的单词(向下) |
# | 搜索当前光标下的单词(向上) |
f字符 | 在当前行内向右找到该字符 |
F字符 | 在当前行内向左找到该字符 |
t字符 | 在当前行内向右找到该字符前 |
T字符 | 在当前行内向左找到该字符前 |
; / , | 重复上次 f/F/t/T 的搜索,方向相同/相反 |
第四篇:编辑实战 —— 增删改查的完整技法
第 7 章 插入文本的多种方式
除了最基本的 i,Vim 提供了多种进入插入模式的方式,每种对应不同的场景:
| 命令 | 含义 | 适用场景 |
|---|---|---|
i | 在光标前插入 | 最常用 |
I | 在行首插入 | 快速在行首添加内容 |
a | 在光标后追加 | 在单词末尾追加 |
A | 在行尾追加 | 快速在行尾添加内容 |
o | 在下方新建一行并插入 | 在代码块下方新建行 |
O | 在上方新建一行并插入 | 在代码块上方新建行 |
s | 删除当前字符并进入插入 | 替换单个字符 |
S | 删除当前行并进入插入 | 重写整行 |
c + 移动 | 删除指定范围并进入插入 | 修改任意文本范围 |
第 8 章 删除与复制(剪切与粘贴)
删除(剪切)
| 命令 | 含义 |
|---|---|
x | 删除当前字符 |
X | 删除前一个字符 |
dw | 删除到单词结束 |
db | 删除到单词开头 |
dd | 删除整行 |
d$ / D | 删除到行尾 |
d0 | 删除到行首 |
dG | 删除到文件尾 |
dgg | 删除到文件头 |
di" | 删除引号内内容 |
da" | 删除引号及其内容 |
dt, | 删除到逗号前 |
df, | 删除到逗号(含逗号) |
复制(yank)
复制命令与删除命令结构完全相同,只需将 d 替换为 y:
| 命令 | 含义 |
|---|---|
yy 或 Y | 复制整行 |
yw | 复制一个单词 |
y$ | 复制到行尾 |
y0 | 复制到行首 |
yG | 复制到文件尾 |
yi" | 复制引号内内容 |
ya" | 复制引号及其内容 |
粘贴
| 命令 | 含义 |
|---|---|
p | 在光标后粘贴(行粘贴时在下一行) |
P | 在光标前粘贴(行粘贴时在上一行) |
"0p | 粘贴系统剪贴板内容(如果开启了剪贴板支持) |
第 9 章 修改与替换
修改(change):删除 + 进入插入模式
| 命令 | 含义 |
|---|---|
cw | 修改到单词结束 |
cb | 修改到单词开头 |
cc | 修改整行 |
C | 修改到行尾 |
ci" | 修改引号内内容 |
ct, | 修改到逗号前 |
字符替换
| 命令 | 含义 |
|---|---|
r字符 | 将当前字符替换为指定字符 |
R | 进入替换模式(覆盖式输入) |
~ | 切换当前字符的大小写 |
搜索与替换(全局)
| 命令 | 含义 |
|---|---|
:%s/old/new/g | 将整个文件中所有 old 替换为 new |
:%s/old/new/gc | 同上,但每次替换前确认 |
:s/old/new/ | 替换当前行第一个 old |
:s/old/new/g | 替换当前行所有 old |
:10,20s/old/new/g | 替换第 10 到 20 行 |
:%s/old/new/gi | 忽略大小写替换 |
第 10 章 撤销与重做
| 命令 | 含义 |
|---|---|
u | 撤销上一次操作 |
U | 撤销当前行上的所有修改 |
Ctrl + r | 重做(撤销撤销) |
. | 重复上一次修改操作(极其有用) |
💡
.命令的威力:Vim 中最强大的命令之一。例如,你先执行了dw删除一个单词,然后按.就会再次执行dw。如果你想对多个位置做同样的操作,只需移动光标并按.。
第五篇:进阶技巧 —— 成为真正的 Vim 用户
第 11 章 多文件与多窗口
多文件编辑
| 命令 | 含义 |
|---|---|
:e filename | 打开另一个文件 |
:w | 保存当前文件 |
:wq | 保存并退出当前文件 |
:bn | 切换到下一个文件(buffer) |
:bp | 切换到上一个文件(buffer) |
:ls | 列出所有打开的文件 |
:b 数字 | 切换到指定编号的文件 |
分屏操作
| 命令 | 含义 |
|---|---|
:split 或 Ctrl+w s | 水平分屏 |
:vsplit 或 Ctrl+w v | 垂直分屏 |
Ctrl+w w | 在屏之间切换 |
Ctrl+w h/j/k/l | 切换到左/下/上/右的屏 |
Ctrl+w = | 均匀分配屏大小 |
Ctrl+w + / Ctrl+w - | 增大/减小屏高度 |
Ctrl+w > / Ctrl+w < | 增大/减小屏宽度 |
:only | 关闭其他屏,只保留当前屏 |
第 12 章 寄存器与宏
寄存器(Registers):Vim 的剪贴板体系
Vim 有多个剪贴板,称为寄存器。默认的删除和复制会存入 " 寄存器,但你可以指定其他寄存器。
| 命令 | 含义 |
|---|---|
"ayy | 复制当前行到寄存器 a |
"ap | 粘贴寄存器 a 的内容 |
"+y | 复制到系统剪贴板(Linux/Windows 下为 + 寄存器) |
"+p | 从系统剪贴板粘贴 |
:reg | 查看所有寄存器内容 |
宏(Macros):记录并重复操作
宏可以记录一系列按键操作,然后重复执行。
| 命令 | 含义 |
|---|---|
q寄存器 | 开始录制宏(如 qa 开始录制到 a 寄存器) |
| 执行操作 | 录制过程中执行你的操作 |
q | 停止录制 |
@寄存器 | 执行宏(如 @a 执行宏 a) |
数字@寄存器 | 多次执行宏(如 10@a 执行 10 次) |
典型宏用例:将多行文本每行末尾加上逗号
qa开始录制到寄存器 aA,在行尾添加逗号j移到下一行q停止录制10@a对接下来 10 行执行相同操作
第 13 章 标记(Marks):快速跳转
标记让你在文件中做”书签”,方便快速跳转。
| 命令 | 含义 |
|---|---|
ma | 在当前位置设置标记 a(a-z 为局部标记,A-Z 为全局标记) |
'a | 跳转到标记 a 所在行的行首 |
`a | 跳转到标记 a 的精确位置 |
'' | 跳转到上一次跳转前的位置 |
| ` “ | 跳转到上一次跳转前的精确位置 |
:marks | 查看所有标记 |
第 14 章 折叠(Folding):管理大文件
折叠可以将代码块或段落收起来,让大文件浏览更清晰。
| 命令 | 含义 |
|---|---|
zf + 移动 | 创建折叠(如 zf% 折叠到匹配的括号) |
zR | 展开所有折叠 |
zM | 关闭所有折叠 |
zo | 展开当前折叠 |
zc | 关闭当前折叠 |
zO | 递归展开当前折叠 |
zC | 递归关闭当前折叠 |
zd | 删除当前折叠 |
第六篇:定制与生态 —— 打造属于你的 Vim
第 15 章 配置文件:.vimrc
Vim 的所有行为都可以通过配置文件定义。Linux/macOS 下为 ~/.vimrc,Windows 下为 $HOME\_vimrc。
基础配置模板
" ============================================
" 基础设置
" ============================================
set number " 显示行号
set relativenumber " 显示相对行号
syntax on " 语法高亮
set autoindent " 自动缩进
set smartindent " 智能缩进
set tabstop=4 " Tab 宽度
set shiftwidth=4 " 缩进宽度
set expandtab " Tab 转为空格
set showmatch " 高亮匹配括号
set hlsearch " 高亮搜索匹配
set incsearch " 边输入边搜索
set ignorecase " 搜索忽略大小写
set smartcase " 若有大小写则区分
set wildmenu " 命令补全菜单
set showcmd " 显示正在输入的命令
set ruler " 显示光标位置
set mouse=a " 启用鼠标
" ============================================
" 快捷键映射
" ============================================
" 保存文件
nnoremap <C-s> :w<CR>
" 退出
nnoremap <C-q> :q<CR>
" 重新加载配置
nnoremap <F5> :source ~/.vimrc<CR>
" 取消高亮
nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>
" ============================================
" 颜色与主题
" ============================================
colorscheme desert " 可选:default, desert, elflord, evening, morning, murphy, pablo, ron, shine, torte, zellner
set background=dark " 或 light
" ============================================
" 文件编码
" ============================================
set encoding=utf-8
set fileencodings=utf-8,gbk,gb2312
第 16 章 插件生态
Vim 的插件系统让它从编辑器蜕变为可定制的开发平台。
推荐插件管理器:vim-plug
安装:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
在 .vimrc 中配置插件:
call plug#begin('~/.vim/plugged')
" 文件树
Plug 'preservim/nerdtree'
Plug 'ryanoasis/vim-devicons' " 图标支持
" 状态栏
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
" 代码补全(需 Node.js)
Plug 'neoclide/coc.nvim', {'branch': 'release'}
" Git 集成
Plug 'tpope/vim-fugitive'
" 代码注释
Plug 'tpope/vim-commentary'
" 括号配对
Plug 'jiangmiao/auto-pairs'
" 模糊搜索
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
" 语法检查
Plug 'dense-analysis/ale'
" 主题
Plug 'morhetz/gruvbox'
Plug 'joshdick/onedark.vim'
call plug#end()
安装插件:在 Vim 中执行 :PlugInstall
第 17 章 常见操作场景
场景一:编辑配置文件
Vim 天生适合编辑各类配置文件。启用语法高亮后,/etc/hosts、nginx.conf、settings.json 等都会自动着色。
场景二:写代码
搭配 COC 或 YouCompleteMe,Vim 可以获得:
- 自动补全
- 跳转定义(
gd) - 查看引用(
gr) - 重命名
- 代码格式化(
gg=G)
场景三:写 Markdown/文章
Vim 有丰富的 Markdown 支持,配合 pandoc 甚至可以导出 PDF。
场景四:远程服务器运维
Vim 几乎出现在所有 Linux 服务器上,不需要额外安装。当你通过 SSH 连接服务器时,Vim 是修改配置的最可靠工具。
第七篇:学习路径与资源
第 18 章 分阶段学习计划
| 阶段 | 时间 | 学习内容 | 目标 |
|---|---|---|---|
| 第一周 | 每天 30 分钟 | vimtutor、退出/保存、hjkl 移动、i 插入、dd/yy/p、u 撤销 | 能基本编辑文件,不害怕打开 Vim |
| 第二周 | 每天 30 分钟 | w/b、0/$、gg/G、dw/yw、搜索 /、替换 :%s | 编辑效率大幅提升,开始感到”顺手” |
| 第三周 | 日常使用 | 组合命令(di”、ci(、d$ 等)、. 命令、宏 | 开始体验 Vim 的真正威力 |
| 第四周 | 日常使用 | 配置 .vimrc、安装插件、分屏、多文件 | 拥有自己的定制 Vim 环境 |
| 长期 | 持续学习 | 高级命令、脚本编写、新插件探索 | 终身受益 |
第 19 章 最佳学习资源
vimtutor:终端输入即可启动,官方教程,最佳起点。:help:Vim 内置帮助系统,任何命令前加:help即可查询。- 《Practical Vim》(Drew Neil):Vim 领域的经典著作,强烈推荐。
- Vim Adventures:一个将 Vim 操作融入游戏的在线学习网站。
- Open Vim:交互式在线 Vim 教程。
- Vim 官方文档:https://www.vim.org/docs.php
第 20 章 常见问题解答
Q: Vim 和 Vi 有什么区别?
A: Vim 是 Vi 的增强版,多了语法高亮、多级撤销、分屏、插件系统等。在现代 Linux 中,vi 命令通常指向 vim。
Q: 我可以用 Vim 写中文吗?
A: 可以。设置 set encoding=utf-8 后,Vim 完美支持中文输入和显示。
Q: Vim 和 Neovim 是什么关系?
A: Neovim 是 Vim 的一个分支,专注于现代化重构,兼容 Vim 的大部分配置和操作。
Q: 如何让 Vim 有 IDE 的功能?
A: 通过插件。安装 COC 或 YouCompleteMe 获得代码补全,安装 NERDTree 获得文件树,安装 vim-fugitive 获得 Git 支持。
Q: Vim 适合写什么?
A: 几乎一切文本:代码、配置文件、Markdown、LaTeX、纯文本笔记。不适合做 Word 那样的排版。
结语:Vim 是一场修行
Vim 不仅仅是一个工具,它代表了一种对待工作的态度——追求极致效率,愿意投入时间学习更优的方法。初学的痛苦是真实的,但突破瓶颈后的畅快也是真实的。
请记住,每一个 Vim 大师都曾经在退出时不知所措。你遇到的每一个困惑,都有人曾经走过。Vim 社区有着无与伦比的友善和互助传统,当你需要帮助时,:help 永远在那里,社区论坛也永远愿意伸出援手。
最后,送给你一句话:
“学习 Vim 就像学习一门乐器。开始时你会生疏、缓慢、沮丧,但当你真正掌握它,你的指尖将成为思维的延伸,你的编辑将如同呼吸般自然。”
现在,打开你的终端,输入 vimtutor,开始你的 Vim 之旅吧。祝你在这条路上找到属于自己的节奏和乐趣。