Vim 编辑器使用教程:从零开始

技术随笔

Vim 编辑器使用教程:从零开始

1. 概述

Vim 是一个诞生于 1991 年的文本编辑器,以其独特的模式编辑理念在开发者社区中经久不衰。学习 Vim 的曲线确实陡峭,但一旦上手,编辑效率会有质的飞跃。

本文面向零基础读者,从最基础的概念讲起,目标是让你在读完本文后能流畅使用 Vim 进行日常开发。本文不涉及特定操作系统的安装细节,重点放在 Vim 本身的用法上。你可以在 Zed、VS Code(Vim 插件)、或者原生 Vim 中实践本文的内容。

学习建议:不要试图一次性记住所有快捷键。先掌握前 3 章的内容(模式切换 + 移动 + 简单编辑),用到熟练后,再逐步扩展学习后面的章节。

2. 核心理念:模式编辑

Vim 最大的特点是有多种模式,不同模式下按键的作用不同:

┌─────────────────────────────────────────────────┐
│                      Vim 模式                     │
│                                                   │
│    Esc / Ctrl+[          i / a / o / s / ...     │
│  ┌──────────┐  ──────────────────────→  ┌──────┐ │
│  │ 普通模式  │  ←──────────────────────  │插入模式│ │
│  │ (Normal)  │         Esc              │(Insert)│ │
│  └──────────┘                           └──────┘ │
│       │  ↑                                  │     │
│       │  │ v / V / Ctrl+v                   │     │
│       v  └───────────────────────────────  │     │
│  ┌──────────┐                              │     │
│  │ 可视模式  │  ←───────────────────────  │     │
│  │ (Visual)  │         Esc                  │     │
│  └──────────┘                              │     │
│       │                                     │     │
│       v                                     │     │
│  ┌──────────┐                              │     │
│  │ 命令行模式 │                              │     │
│  │(Command)  │                              │     │
│  └──────────┘                              │     │
└─────────────────────────────────────────────────┘

2.1 四种核心模式

| 模式 | 用途 | 如何进入 | |------|------|----------| | 普通模式 (Normal) | 导航、复制、删除、粘贴等操作 | 启动 Vim 时默认在此模式,按 Esc 从任何模式返回 | | 插入模式 (Insert) | 输入和编辑文本 | i(光标前)、a(光标后)、o(新行)等 | | 可视模式 (Visual) | 选择文本块 | v(字符)、V(行)、Ctrl+v(矩形块) | | 命令行模式 (Command) | 保存、退出、搜索、替换等 | :(Ex 命令)、/(搜索) |

2.2 最重要的原则:尽量少用插入模式

Vim 的设计哲学是:在普通模式下完成大多数操作,只在真正需要输入文字时才进入插入模式

  • 想删除一行?在普通模式下按 dd,不需要进入插入模式
  • 想复制一行?在普通模式下按 yy
  • 想移动光标?在普通模式下按 hjkl
  • 想修改单词?在普通模式下按 ciw

新手最常见的错误:习惯性地一直按 i 进入插入模式,然后用方向键移动、用退格键删除。这样做就失去了 Vim 的意义。正确的做法是:用完插入模式后立即按 Esc 回到普通模式

3. 光标移动

Vim 不依赖方向键(虽然也支持),而是使用 hjkl 四键:

         ↑
         k
   ← h      l →
         j
         ↓

3.1 基础移动

| 按键 | 说明 | |------|------| | h | 向左移动一个字符 | | j | 向下移动一行 | | k | 向上移动一行 | | l | 向右移动一个字符 | | 0 | 跳到行首 | | ^ | 跳到行首第一个非空字符 | | $ | 跳到行尾 | | w | 跳到下一个单词开头 | | b | 跳到上一个单词开头 | | e | 跳到当前单词结尾 | | ge | 跳到上一个单词结尾 |

3.2 单词的概念

Vim 中的"单词"分两种:

  • 小单词(word):由字母/数字/下划线组成,遇到符号就分割
  • 大单词(WORD):遇到空格才分割

| 操作 | 小单词 | 大单词 | |------|--------|--------| | 向后 | w | W | | 向前 | b | B | | 到结尾 | e | E |

例如在 hello.world foo bar 上:

  • w 会跳转到 .foobar
  • W 会跳转到 foobar(跳过 hello.world 整体)

3.3 行间跳转

| 按键 | 说明 | |------|------| | gg | 跳到文件第一行 | | G | 跳到文件最后一行 | | :n | 跳到第 n 行(:42 跳到第 42 行) | | Ctrl + D | 向下翻半页 | | Ctrl + U | 向上翻半页 | | Ctrl + F | 向下翻一页 | | Ctrl + B | 向上翻一页 | | H | 跳到屏幕顶部 | | M | 跳到屏幕中间 | | L | 跳到屏幕底部 | | zz | 把当前行置于屏幕中央 | | zt | 把当前行置于屏幕顶部 | | zb | 把当前行置于屏幕底部 |

3.4 括号与段落

| 按键 | 说明 | |------|------| | % | 跳到匹配的括号 ()/[]/{} | | { | 跳到上一个空行(段落分隔) | | } | 跳到下一个空行 | | ( | 跳到上一个句子 | | ) | 跳到下一个句子 |

3.5 数字前缀

几乎所有移动命令前都可以加数字,表示重复执行:

5j         # 向下移动5行
3w         # 向前跳3个单词
2gg        # 跳到第2行
10k        # 向上移动10行

4. 文本编辑基础

4.1 进入插入模式

| 按键 | 说明 | |------|------| | i | 在光标插入 | | a | 在光标插入 | | I | 在行首插入 | | A | 在行尾插入 | | o | 在当前行下方新建一行并插入 | | O | 在当前行上方新建一行并插入 | | s | 删除光标处字符并插入 | | S | 删除当前行并插入 | | gi | 回到上一次插入的位置并进入插入模式 |

4.2 删除

| 按键 | 说明 | |------|------| | x | 删除光标处字符(像退格键的相反方向) | | X | 删除光标前一个字符 | | dd | 删除当前行 | | D | 删除光标到行尾 | | dw | 删除一个单词 | | d$ | 删除光标到行尾(同 D) | | d0 | 删除光标到行首 | | dG | 删除光标到文件末尾 | | dgg | 删除光标到文件开头 |

4.3 复制(Yank)与粘贴

| 按键 | 说明 | |------|------| | yy | 复制当前行 | | Y | 复制当前行(同 yy) | | yw | 复制一个单词 | | y$ | 复制光标到行尾 | | p | 在光标粘贴 | | P | 在光标粘贴 | | dd + p | 剪切并粘贴(移动行) |

理解删除/复制/粘贴的关系d(delete)、y(yank, 复制)、c(change, 删除并进入插入模式)都会把被操作的内容存入寄存器。然后可以用 p 粘贴出来。所以 dd 相当于剪切,yy 相当于复制。

4.4 撤销与重做

| 按键 | 说明 | |------|------| | u | 撤销 | | Ctrl + R | 重做 | | . | 重复上一次操作(最强大的 Vim 命令之一) |

4.5 修改与替换

| 按键 | 说明 | |------|------| | r | 替换光标处的一个字符 | | R | 进入替换模式(覆盖式输入) | | c | 修改(删除并进入插入模式) | | cc | 修改当前行 | | C | 修改光标到行尾 | | ciw | 修改当前单词 | | ci" | 修改双引号内的内容 | | ci( | 修改括号内的内容 | | ~ | 切换光标处字符的大小写 |

4.6 缩进

| 按键 | 说明 | |------|------| | >> | 向右缩进当前行 | | << | 向左缩进当前行 | | == | 自动缩进当前行 | | >G | 从当前行缩进到文件末尾 | | >} | 缩进到当前段落末尾 |

5. 组合操作:Vim 的语法

Vim 的强大之处在于它的可组合性。大多数操作遵循这样的语法:

[数字] + 操作符 + 移动命令

5.1 基本公式

  d     w        → 删除一个单词(delete word)
  3    d     w   → 删除三个单词
  操   移    动
 作     动
 符     命
         令
  
  示例:
  d2j      → 向下删除两行(delete 2 down)
  y3k      → 向上复制三行(yank 3 up)
  c$       → 从光标修改到行尾(change to end of line)
  dap      → 删除整个段落(delete a paragraph)
  yip      → 复制当前段落内部(yank inner paragraph)
  ciw      → 修改当前单词(change inner word)
  ca"      → 修改双引号及内容(change around quotes)

5.2 操作符

| 操作符 | 说明 | |--------|------| | d | 删除 (delete) | | y | 复制 (yank) | | c | 修改 (change) → 删除后进入插入模式 | | v | 选中 (visual) | | > | 缩进 | | < | 取消缩进 | | g~ | 切换大小写 | | gu | 转为小写 | | gU | 转为大写 |

5.3 文本对象

文本对象是 Vim 最强大的特性之一,可以把光标放在文本块内部直接操作:

c  i  w     → 修改当前单词(change inner word)
d  i  "     → 删除双引号内的内容
y  a  (     → 复制括号及内容

| 对象 | 含义 | 示例 | |------|------|------| | iw | 当前单词内部 | ciw 修改单词 | | aw | 当前单词及周围空格 | daw 删除单词 | | ip | 当前段落内部 | yip 复制段落 | | ap | 当前段落 | dap 删除段落 | | i( / i) | 括号内部 | ci( 修改括号内容 | | a( / a) | 括号及内容 | da) 删除括号及内容 | | i" | 引号内部 | ci" 修改引号内容 | | i[ / i{ | 方/花括号内部 | ci{ 修改花括号内容 | | it | HTML/XML 标签内部 | cit 修改标签内容 | | at | HTML/XML 标签及内容 | dat 删除整个标签 |

5.4 练习示例

假设光标停在下面这行代码的 Rust 上:

fn main() { println!("Hello, Rust 世界!"); }

| 按键组合 | 效果 | |----------|------| | ciw | 删除 Rust 并进入插入模式,输入新内容 | | ci( | 删除 () 内的内容并进入插入模式 | | ci" | 删除 "Hello, Rust 世界!" 并进入插入模式 | | da" | 删除 "Hello, Rust 世界!" 及引号 | | dt) | 删除从光标到 ) 前的所有内容 | | df) | 删除从光标到 ) 及括号本身 | | y3w | 复制从 Rust 开始的三个单词 | | d2b | 向后删除两个单词 |

6. 搜索与替换

6.1 行内搜索

| 按键 | 说明 | |------|------| | f{char} | 行内向右搜索字符(fx 跳到下一个 x) | | F{char} | 行内向左搜索字符 | | t{char} | 行内向右搜索字符前(tx 跳到 x 前一字符) | | T{char} | 行内向左搜索字符前 | | ; | 重复上一次行内搜索 | | , | 反向重复上一次行内搜索 |

6.2 全文搜索

| 按键 | 说明 | |------|------| | /{pattern} | 向下搜索 | | ?{pattern} | 向上搜索 | | n | 下一个匹配 | | N | 上一个匹配 | | * | 搜索光标下的单词(向下) | | # | 搜索光标下的单词(向上) | | :noh | 清除搜索高亮 |

6.3 搜索与替换

# 将当前行的第一个 "foo" 替换为 "bar"
:s/foo/bar/

# 将当前行的所有 "foo" 替换为 "bar"
:s/foo/bar/g

# 将全文的所有 "foo" 替换为 "bar"
:%s/foo/bar/g

# 全局替换,每次询问确认
:%s/foo/bar/gc

# 在 10-20 行之间替换
:10,20s/foo/bar/g

# 替换时确认(c = confirm)
:%s/foo/bar/gc
# 确认选项:y=是 n=否 a=全部 q=退出 l=替换当前并退出

7. 文件操作

| 命令 | 说明 | |------|------| | :w | 保存文件 | | :q | 退出(如果文件未保存会报错) | | :q! | 强制退出(放弃修改) | | :wq | 保存并退出 | | :x | 保存并退出(同 :wq) | | ZZ | 保存并退出(普通模式下) | | :e! | 重新加载文件(放弃所有修改) | | :e file.rs | 打开 file.rs | | :new | 水平分屏打开新文件 | | :vnew | 垂直分屏打开新文件 | | :Explore | 打开文件浏览器(需要 netrw 插件) |

8. 可视模式

8.1 三种可视模式

| 按键 | 模式 | 说明 | |------|------|------| | v | 字符可视模式 | 选择连续的字符 | | V | 行可视模式 | 选择整行 | | Ctrl + v | 块可视模式 | 矩形块选择(最强大) |

8.2 可视模式常用操作

选择文本后:

| 按键 | 说明 | |------|------| | d / x | 删除选中内容 | | y | 复制选中内容 | | c | 删除并进入插入模式 | | ~ | 切换大小写 | | > / < | 缩进/取消缩进 | | J | 合并选中行 | | r | 批量替换字符(块可视模式) | | I | 块前插入(块可视模式) | | A | 块后插入(块可视模式) |

8.3 块可视模式实战

块可视模式可以进行非常高效的批量编辑:

要求:在以下每行前面加上 "- ":

  苹果            →    - 苹果
  香蕉            →    - 香蕉
  橘子            →    - 橘子

操作步骤:
1. 光标移到第一行的行首
2. Ctrl + v        进入块可视模式
3. jj              向下选择两行(选中三行行首)
4. I               进入块前插入模式
5. 输入 "- "
6. Esc             应用修改到所有选中行

9. 多文件与分屏

| 命令 | 说明 | |------|------| | :sp file.rs | 水平分屏打开 | | :vs file.rs | 垂直分屏打开 | | Ctrl + w + h/j/k/l | 在分屏间移动光标 | | Ctrl + w + w | 循环切换分屏 | | Ctrl + w + = | 等分屏大小 | | Ctrl + w + _ | 最大化当前分屏高度 | | Ctrl + w + \| | 最大化当前分屏宽度 | | :q | 关闭当前分屏 | | :only | 只保留当前分屏 | | :tabnew | 新建标签页 | | gt | 下一个标签页 | | gT | 上一个标签页 | | :bnext / :bprev | 切换缓冲区 |

10. 寄存器与宏

10.1 寄存器基础

Vim 的删除/复制内容存储在寄存器中,可以用 "{reg} 指定:

"ayy        # 复制当前行到寄存器 a
"ap         # 粘贴寄存器 a 的内容
"ad3w       # 删除三个单词到寄存器 a
"+yy        # 复制到系统剪贴板(X11 系统)
"*yy        # 复制到系统剪贴板(macOS/Win)
"+p         # 从系统剪贴板粘贴

10.2 宏录制

宏可以录制一系列操作并重复执行:

qa          # 开始录制宏到寄存器 a
...         # 执行一系列操作
q           # 停止录制
@a          # 播放宏 a
5@a         # 播放宏 a 5次
@@          # 重复上一次宏

宏实战示例:将以下文本中的每行用引号包裹:

苹果         →    "苹果",
香蕉         →    "香蕉",
橘子         →    "橘子",

操作步骤:

1. 光标移到第一行行首
2. qa               开始录制宏到 a
3. i"               在行首插入 "
4. Esc              回到普通模式
5. A",             在行尾添加 ",(A = 行末插入)
6. j                移动到下一行
7. q                停止录制
8. 2@a              对剩余两行执行宏

11. Vim 配置入门

11.1 配置文件

Vim 的配置文件是 ~/.vimrc(Linux/macOS)或 ~/_vimrc(Windows)。Neovim 使用 ~/.config/nvim/init.lua

11.2 基础配置示例

" ── 基础设置 ──
set nocompatible              " 不兼容传统 Vi
set number                    " 显示行号
set relativenumber            " 显示相对行号
set cursorline                " 高亮当前行
set expandtab                 " 用空格代替 Tab
set tabstop=2                 " Tab 宽度 2
set shiftwidth=2              " 缩进宽度 2
set autoindent                " 自动缩进
set smartindent               " 智能缩进
set wrap                      " 自动换行
set ignorecase                " 搜索忽略大小写
set smartcase                 " 有大小写时不忽略
set incsearch                 " 增量搜索
set hlsearch                  " 搜索高亮
set showcmd                   " 显示命令

" ── 快捷键 ──
" 取消搜索高亮
nnoremap <Esc><Esc> :noh<CR>

" 用 jk 代替 Esc(最受欢迎的 Vim 映射)
inoremap jk <Esc>

" 与系统剪贴板交互(需要 +clipboard 特性)
set clipboard=unnamedplus

" 保存时自动去除行尾空格
autocmd BufWritePre * :%s/\s\+$//e

11.3 Vim 的哲学:养成习惯

1. 用完插入模式立刻 Esc
2. 能用组合键不用多次按键
3. 能复用 . 就不用重复操作
4. 能用宏就不用手工操作
5. 能使用文本对象就不手动选择

12. Vim 学习资源

  • :help — Vim 内置帮助系统,最权威的资料
  • vimtutor — 终端中执行 vimtutor,交互式教程(约 30 分钟)
  • Vim Adventures — 游戏化学习 Vim
  • Open Vim — 在线交互式 Vim 教程

13. 总结

三周学习计划

| 阶段 | 内容 | 产出 | |------|------|------| | 第 1 周 | 模式切换、hjkl 移动、i/a/o 插入、dd/yy/p | 能完成基础文本编辑 | | 第 2 周 | w/b/0/$/gg/Gciw/di( 文本对象、搜索替换 | 编辑效率明显提升 | | 第 3 周 | 可视模式、块操作、寄存器、宏录制 | 批量处理任务轻松掌握 |

核心快捷键速查

移动:    h j k l | w b e | 0 ^ $ | gg G | % | { }
编辑:    i a o   | dd yy p | c d y | u Ctrl+r | .
搜索:    / ?     | n N     | * #   | f t F T
文件:    :w :q   | :wq ZZ  | :e   | :sp :vs
视图:    zz zt zb | Ctrl+d Ctrl+u
高级:    .       | q + 宏  | Ctrl+v 块操作 | ci" ci(

最后,Vim 的学习没有终点。即使使用十年以上的 Vim 用户,也常常能发现新的技巧。关键是先把基础操作练到肌肉记忆,再逐步扩展。

Vim编辑器入门效率