跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

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):精确指定范围

修饰语含义示例
iinside(内部,不含边界)di" → 删除双引号内的内容
aaround(包含边界)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 次)

典型宏用例:将多行文本每行末尾加上逗号

  1. qa 开始录制到寄存器 a
  2. A, 在行尾添加逗号
  3. j 移到下一行
  4. q 停止录制
  5. 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 章 最佳学习资源

  1. vimtutor:终端输入即可启动,官方教程,最佳起点。
  2. :help:Vim 内置帮助系统,任何命令前加 :help 即可查询。
  3. 《Practical Vim》(Drew Neil):Vim 领域的经典著作,强烈推荐。
  4. Vim Adventures:一个将 Vim 操作融入游戏的在线学习网站。
  5. Open Vim:交互式在线 Vim 教程。
  6. 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 之旅吧。祝你在这条路上找到属于自己的节奏和乐趣。

作者

老丹

关注我
其他文章
上一个

Clash 完全指南:规则驱动的现代代理工具

下一个

Tailscale 工作原理详解:现代VPN的架构、连接与安全

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • Ubuntu 防火墙迁移指南:从 UFW 到 firewalld 的完整实践 2026年9月12日
  • Nano 编辑器完全操作指南:从入门到熟练 2026年9月12日
  • SSCG:让自签名证书不再“危险”的生成工具 2026年9月12日
  • Ubuntu Samba 服务安装与配置完全指南 2026年9月12日
  • 从零开始:用 Docker 部署 Jellyfin 并启用英特尔核显硬件加速 2026年9月11日

文章分类

  • C/C++开发 (22)
  • Docker容器 (5)
  • Linux工具包 (17)
  • Linux服务配置 (50)
  • Linux系统 (16)
  • OpenWrt路由 (3)
  • Shell脚本 (3)
  • 代码管理 (1)
  • 安防技术 (4)
  • 数据安全 (36)
  • 未分类 (1)
  • 网络协议 (25)
  • 计算机理论 (23)
  • 音视频技术 (5)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号