TL;DR
Vim 是一款模态文本编辑器 —— 你需要在普通模式、插入模式、可视模式和命令模式之间切换。学习曲线较陡,但回报巨大:完全不离开键盘即可以思考的速度进行编辑。本指南涵盖从退出 Vim 到录制宏、配置 Neovim、以及使用 Telescope 和 LSP 构建现代类 IDE 工作流的全部内容。
核心要点
- Vim 有五种模式 —— 普通模式是默认模式;始终用 Escape 返回
- 学习文本对象(
diw、ci"、da{})—— 这是最有效率倍增效果的功能 - 使用
.(点命令)重复上次修改 —— 与文本对象结合实现强大编辑 - 宏(
q/@)可在多行上自动化重复的多步骤编辑 - 带
c标志的:%s/旧/新/gc让你逐个确认每次替换 - Neovim + Lua 配置(
init.lua)+ Lazy.nvim 是现代完整 IDE 设置的推荐方式 - 分屏 + 缓冲区 + 标记可替代大多数工作流中的标签页 —— 掌握
Ctrl+w导航 - 投入一周时间突破初期障碍 —— 之后生产力呈指数级增长
简介:为什么在 2026 年学习 Vim?
Vim 自 1991 年以来一直是开发者的利器,其影响力有增无减。每个主流 IDE —— VS Code、JetBrains、Xcode —— 都提供 Vim 模拟插件,且通常是安装量最高的扩展之一。SSH 会话、生产服务器和容器环境几乎总是有 vi 可用。理解 Vim 赋予你一种通用的编辑超能力。
核心思想是模态编辑:Vim 在不同模式之间切换,而不是为每个命令使用修饰键(Ctrl、Alt)。在普通模式下,每个键都是命令;在插入模式下,键输入文字。这听起来违反直觉,但却能使用助记单字符命令实现极其快速、精确的文本操作。
Neovim 是 Vim 的现代化分支,增加了内置 LSP 支持、异步处理、Lua API 和活跃的插件生态系统。本指南同时涵盖 Vim 和 Neovim,在存在差异的地方会特别标注。如果你是新手,推荐选择 Neovim。
1. Vim 模式详解
理解 Vim 的模态系统是最重要的核心概念。初学者遇到的所有困惑都源于意外进入了错误的模式。
普通模式 — 命令中枢
普通模式是打开文件时的默认模式。按键被解释为命令,而非文本输入。始终用 Escape(或更快的 Ctrl+[)返回此模式。在 Vim 中,你的大部分时间应该在普通模式下度过 —— 每次编辑之间都会返回这里。
插入模式 — 输入文字
插入模式的工作方式与传统文本编辑器相同。从普通模式进入插入模式有多种方式,每种方式放置光标的位置不同:
| 按键 | 操作 |
|---|---|
i | 在光标前插入 |
I | 在行首插入 |
a | 在光标后追加 |
A | 在行尾追加 |
o | 在下方新建一行并插入 |
O | 在上方新建一行并插入 |
s | 删除字符并进入插入模式 |
S | 删除行并进入插入模式 |
可视模式 — 选择文本
可视模式在应用操作前高亮显示文本。有三种变体:
| 按键 | 模式 | 说明 |
|---|---|---|
v | 字符可视 | 逐字符选择 |
V | 行可视 | 选择整行 |
Ctrl+v | 块可视 | 矩形列选择 —— 同时在多列中插入/删除 |
gv | 重新选择 | 重新选择上次的可视选区 |
2. 基本导航
基础移动:h/j/k/l
h ← 左
j ↓ 下
k ↑ 上
l → 右
" 所有命令都接受数量前缀:
5j " 向下移动5行
10h " 向左移动10个字符单词移动
w " 移到下一个单词开头(在标点处停止)
W " 移到下一个 WORD 开头(以空格分隔)
b " 向后移到单词开头
e " 移到单词末尾
ge " 向后移到上一个单词末尾行和文件导航
0 " 移到行首(第0列)
^ " 移到第一个非空白字符
$ " 移到行尾
gg " 移到文件第一行
G " 移到文件最后一行
42G " 移到第42行
Ctrl+f " 向前滚动一整页
Ctrl+b " 向后滚动一整页
zz " 将当前行居中显示在屏幕上搜索导航
/pattern " 向前搜索模式
?pattern " 向后搜索模式
n " 下一个匹配(同方向)
N " 上一个匹配(反方向)
* " 向前搜索光标下的单词
# " 向后搜索光标下的单词3. 核心编辑命令
删除、复制和粘贴
" === 删除 ===
x " 删除光标下的字符
dd " 删除整行
D " 删除从光标到行尾
dw " 删除单词
d3w " 删除3个单词
dG " 删除从当前行到文件末尾
" === 复制(yank)===
yy " 复制当前行
yw " 复制单词
y$ " 复制到行尾
yG " 复制到文件末尾
" === 粘贴(put)===
p " 在光标后粘贴
P " 在光标前粘贴
"+p " 从系统剪贴板粘贴(+寄存器)
"0p " 粘贴上次明确复制的文本(非删除操作)撤销和重做
u " 撤销上次修改
U " 撤销当前行的所有修改
Ctrl+r " 重做(撤销撤销操作)
5u " 撤销最近5次修改4. 文本对象 —— Vim 的超能力
文本对象是 Vim 最强大的功能,大多数其他编辑器都缺乏这一特性。它们让你用单个操作符对语义块进行操作:单词、句子、段落、引号字符串、括号表达式、HTML 标签等。
语法是:操作符 + i/a + 对象。i 前缀表示内部(不包括外围分隔符),a 表示周围(包括外围分隔符)。
diw " 删除内部单词(只删单词,不含空格)
daw " 删除整个单词(单词+周围空格)
ciw " 修改内部单词(删除单词后进入插入模式)
ci" " 修改双引号内的内容:"hello" → ""
ca" " 修改双引号及内容(删除引号)
ci( " 修改括号内的内容:foo(bar) → foo()
da{ " 删除花括号及内容
yip " 复制内部段落
dit " 删除 HTML/XML 标签内的内容
cat " 删除整个标签(含标签本身)
" 实际示例:
" 光标在以下内容内的任意位置:console.log("hello world")
ci" " → console.log("") (修改引号内容)
" 光标在以下内容内的任意位置:function foo(a, b, c)
ci( " → function foo() (清空参数)5. 搜索和替换
" 基本语法::[范围]s/模式/替换/[标志]
:s/old/new " 替换当前行第一个 'old'
:s/old/new/g " 替换当前行所有 'old'(g=全局)
:%s/old/new/g " 替换整个文件中的所有(%=所有行)
:%s/old/new/gc " 替换所有,逐个确认(c=确认)
:%s/old/new/gi " 替换所有,不区分大小写(i)
" 范围示例:
:1,10s/foo/bar/g " 第1-10行
:'<,'>s/foo/bar/g " 可视选区(V模式后输入:自动填充)
" 实用模式:
:%s/s+$//e " 删除每行末尾空白(e=找不到时不报错)
:%s/^/ /g " 在每行开头添加2个空格
" 全局命令:
:g/pattern/d " 删除所有包含模式的行
:g/^s*$/d " 删除所有空行
:v/pattern/d " 删除所有不匹配模式的行6. 宏 —— 自动化重复编辑
宏录制一系列普通模式命令(包括进入/退出插入模式、移动和 Ex 命令)并重放它们。对于重复的结构性编辑,宏是 Vim 最强大的自动化功能。
qa " 开始录制到寄存器 'a'
" ... 执行你的操作序列 ...
q " 停止录制
@a " 播放宏 'a' 一次
@@ " 重放上次使用的宏
5@a " 播放宏 'a' 5次
:%normal @a " 将宏应用到文件的每一行
" 查看宏内容:
"ap " 粘贴寄存器 'a' 查看录制的序列7. 配置 —— .vimrc 和 init.lua
基本 .vimrc 设置
" ~/.vimrc — 基本设置
set nocompatible " 不兼容 Vi(启用 Vim 改进)
filetype plugin indent on " 启用文件类型检测、插件和缩进
syntax on " 启用语法高亮
set number " 显示行号
set relativenumber " 显示相对行号(对移动命令非常有用)
set cursorline " 高亮当前行
set hlsearch " 高亮搜索匹配
set incsearch " 增量搜索(边输入边高亮)
set ignorecase " 搜索不区分大小写
set smartcase " 使用大写时覆盖 ignorecase
set tabstop=2 " Tab 显示为 2 个空格
set shiftwidth=2 " 使用 2 个空格缩进
set expandtab " 用空格代替 Tab
set hidden " 允许后台缓冲区无需保存
set undofile " 跨会话持久撤销
set noswapfile " 禁用交换文件
set scrolloff=8 " 光标上下保持 8 行可见
let mapleader = ' ' " 空格键作为 leader 键
" 快速保存和退出
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
" 清除搜索高亮
nnoremap <leader>h :nohlsearch<CR>
" 更好的分屏导航
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l8. Vim vs Neovim 对比
| 功能 | Vim 9.x | Neovim 0.9+ |
|---|---|---|
| 配置语言 | Vimscript 9(新语法) | Lua(主要)+ Vimscript |
| 内置 LSP | 否(需要 coc.nvim) | 是(vim.lsp) |
| Treesitter | 仅插件 | 内置(nvim-treesitter) |
| 异步任务控制 | 有限 | 完整异步 API |
| 插件生态 | 庞大、成熟 | 非常活跃,Lua 优先 |
| 默认设置 | 保守(Vi 兼容) | 合理的现代默认值 |
| 通用可用性 | 大多数系统预装 | 需要单独安装 |
| 入门配置 | 网上有 vimrc 示例 | LazyVim、Kickstart、AstroNvim |
| 最适合 | 服务器、脚本、熟悉 Vimscript | 完整开发工作流、现代 IDE 功能 |
9. 必备插件
| 插件 | 功能 | 适用 |
|---|---|---|
| telescope.nvim | 模糊查找文件、文本、缓冲区 | Neovim |
| fzf.vim | 模糊查找文件和内容 | Vim + Neovim |
| nvim-tree / NERDTree | 文件资源管理器 | Neovim / Vim |
| vim-fugitive | Git 集成(最佳 Git 封装) | Vim + Neovim |
| coc.nvim | 自动补全和 LSP(Vim 兼容) | Vim + Neovim |
| nvim-lspconfig | 原生 LSP 配置 | Neovim |
| nvim-treesitter | 更好的语法高亮和文本对象 | Neovim |
| lualine.nvim | 美观的状态栏 | Neovim |
| vim-surround | 操作括号、引号等包围字符 | Vim + Neovim |
| gitsigns.nvim | 行内 Git 差异标记 | Neovim |
常见问题
如何退出 Vim?
按 Escape 确保在普通模式,然后::q(没有未保存修改时退出),:q!(强制退出,放弃修改),:wq 或 ZZ(保存并退出)。如果一切看起来都出了问题,反复按 Escape 然后输入 :q! 总能成功退出。
Vim 的主要模式有哪些?
Vim 有五种主要模式:普通模式(默认,用于导航和命令)、插入模式(用于输入文字,通过 i、a、o 等进入)、可视模式(用于选择文字,通过 v、V 或 Ctrl+v 进入)、命令行模式(用于 Ex 命令,通过 : 进入)和替换模式(通过 R 进入,覆盖现有文字)。理解模式是流畅使用 Vim 的关键。
如何在 Vim 中搜索和替换文本?
使用替换命令::%s/旧/新/g 替换文件中的所有出现。:s/旧/新/g 只替换当前行。添加 c 标志进行确认::%s/旧/新/gc。% 表示"所有行",可以替换为范围如 1,10。
Vim 和 Neovim 有什么区别?
Neovim 是具有内置 LSP、Lua 配置、异步处理、浮动窗口和活跃现代插件生态系统的现代化分支。Vim 更稳定且通常预装在系统上。对于新的开发工作流,推荐 Neovim。在服务器上进行快速编辑时,Vim 总是可用的。
如何学习 Vim?
在终端中运行 vimtutor —— 这是一个内置的 30 分钟互动教程。每天专注学习一个新概念,而不是一次性学完所有内容。强迫自己在一周内只使用 Vim;肌肉记忆会很快形成。最优先练习文本对象和移动命令 —— 它们带来最大的生产力提升。