Vim 完整指南:从入门到高效编辑
-
- [1. 为什么是 Vim](#1. 为什么是 Vim)
- [2. 安装与启动](#2. 安装与启动)
- [3. Vim 的模式](#3. Vim 的模式)
- [4. 基础操作:移动、编辑、保存](#4. 基础操作:移动、编辑、保存)
-
- [4.1 光标移动(普通模式)](#4.1 光标移动(普通模式))
- [4.2 保存与退出](#4.2 保存与退出)
- [4.3 删除、修改、替换](#4.3 删除、修改、替换)
- [4.4 复制粘贴](#4.4 复制粘贴)
- [5. 复制、粘贴、删除与撤销](#5. 复制、粘贴、删除与撤销)
- [6. 搜索与替换](#6. 搜索与替换)
- [7. 可视模式](#7. 可视模式)
- [8. 多文件、多窗口与标签页](#8. 多文件、多窗口与标签页)
- [9. 寄存器](#9. 寄存器)
- [10. 宏:录制与回放](#10. 宏:录制与回放)
- [11. 配置文件 .vimrc](#11. 配置文件 .vimrc)
- [12. 插件管理](#12. 插件管理)
- [13. 高频插件推荐](#13. 高频插件推荐)
- [14. 高级技巧](#14. 高级技巧)
-
- [14.1 命令行窗口](#14.1 命令行窗口)
- [14.2 全局命令 `:g`](#14.2 全局命令
:g) - [14.3 标记(mark)](#14.3 标记(mark))
- [14.4 折叠](#14.4 折叠)
- [14.5 会话与视图](#14.5 会话与视图)
- [14.6 高效组合速查](#14.6 高效组合速查)
- [14.7 文本对象速查](#14.7 文本对象速查)
- [15. 常见问题](#15. 常见问题)
- [16. 总结](#16. 总结)

- 一篇覆盖 Vim 核心功能、配置与实战技巧的系统性指南,适合从零开始到进阶提效的开发者。
- 由于本人水平有限,难免出现错漏,敬请批评改正。
- 更多精彩内容,可点击进入我的个人主页查看
1. 为什么是 Vim
Vim 是一个模式化的文本编辑器,核心优势在于:
- 纯键盘操作,手不离主键区,编辑效率高
- 组合式命令 ,用少量命令拼出强大操作(
d+w= 删除一个单词) - 跨平台,Linux/macOS 自带,Windows 可装 gVim
- 可配置、可扩展,插件生态丰富
- 远程编辑友好,SSH 登录服务器后直接可用
缺点也明显:学习曲线陡峭。但只要掌握 20% 的命令,就能覆盖 80% 的日常编辑。
建议:先用
vimtutor(终端输入vimtutor)花 30 分钟过一遍基础,再回来看本文。
2. 安装与启动
安装
bash
# Ubuntu / Debian
sudo apt install vim
# CentOS / RHEL
sudo yum install vim
# macOS(自带 vim,但建议装新版)
brew install vim
# 检查版本与特性
vim --version
重点看 --version 输出里是否有 +clipboard、+python3、+lua 等特性。
启动方式
bash
vim # 打开空白缓冲区
vim file.txt # 打开文件
vim +10 file.txt # 打开并跳到第 10 行
vim +/pattern file # 打开并定位到第一个匹配
vim file1 file2 # 一次打开多个文件
vim -R file.txt # 只读模式打开
3. Vim 的模式
Vim 的核心是模式切换。最常见的四种模式:
| 模式 | 进入方式 | 用途 |
|---|---|---|
| 普通模式(Normal) | Esc |
移动、删除、复制等命令 |
| 插入模式(Insert) | i a o 等 |
输入文字 |
| 可视模式(Visual) | v V Ctrl+v |
选中文本 |
| 命令行模式(Command) | : / ? |
执行命令、搜索 |
另外还有 替换模式 (R)和 Ex 模式 (Q,较少用)。
切换示意:
普通模式 ──i/a/o──> 插入模式
↑ │
└──────Esc───────────┘
│
├──v/V/Ctrl+v──> 可视模式
└──:/?────────> 命令行模式
新手最容易犯的错:在插入模式里狂按方向键和退格。记住------按
Esc回到普通模式,再用命令操作。
常用进入插入模式的命令
| 命令 | 作用 |
|---|---|
i |
光标前插入 |
a |
光标后插入 |
I |
行首插入 |
A |
行尾插入 |
o |
下方新开一行 |
O |
上方新开一行 |
cc / S |
删除当前行并插入 |
cw |
修改一个单词 |
4. 基础操作:移动、编辑、保存
4.1 光标移动(普通模式)
| 命令 | 作用 |
|---|---|
h j k l |
左、下、上、右 |
w / W |
下一个单词开头(W 忽略标点) |
b / B |
上一个单词开头 |
e / E |
当前/下一个单词结尾 |
0 |
行首 |
^ |
行首第一个非空字符 |
$ |
行尾 |
gg |
文件第一行 |
G |
文件最后一行 |
nG / :n |
跳到第 n 行 |
Ctrl+f / Ctrl+b |
下/上一页 |
Ctrl+d / Ctrl+u |
下/上翻半页 |
% |
跳到匹配的括号 |
{ / } |
上/下一段落 |
H M L |
屏幕顶、中、底 |
fx / Fx |
行内向后/向前找字符 x |
tx / Tx |
找字符 x 的前一个位置 |
组合技巧: 命令前可加数字,如 5j 下移 5 行,3w 前进 3 个单词。
4.2 保存与退出
| 命令 | 作用 |
|---|---|
:w |
保存 |
:w file |
另存为 file |
:q |
退出 |
:q! |
强制退出不保存 |
:wq / :x / ZZ |
保存并退出 |
:wa |
保存所有文件 |
:qa |
退出所有 |
:qa! |
强制退出所有 |
:x与:wq的区别::x只在有修改时才写入,:wq总是写入。
4.3 删除、修改、替换
| 命令 | 作用 |
|---|---|
x |
删除光标处字符 |
X |
删除光标前一个字符 |
dd |
删除当前行(剪切) |
ndd |
删除 n 行 |
dw |
删除一个单词 |
d$ / D |
删除到行尾 |
d0 |
删除到行首 |
dG |
删除到文件末尾 |
r |
替换一个字符 |
R |
进入替换模式 |
~ |
切换大小写 |
guu / gUU |
当前行转小写/大写 |
>> / << |
增加/减少缩进 |
== |
自动缩进当前行 |
J |
合并下一行 |
记住:
d是操作符 ,后面跟动作 。dw、d$、dG、dd都是这个逻辑。
4.4 复制粘贴
| 命令 | 作用 |
|---|---|
yy / Y |
复制当前行 |
nyy |
复制 n 行 |
yw |
复制一个单词 |
y$ |
复制到行尾 |
ggyG |
复制全文 |
p |
粘贴到光标后/下方 |
P |
粘贴到光标前/上方 |
"+yy / "+p |
与系统剪贴板交互(需 +clipboard) |
5. 复制、粘贴、删除与撤销
撤销与重做
| 命令 | 作用 |
|---|---|
u |
撤销 |
Ctrl+r |
重做 |
U |
撤销整行修改 |
. |
重复上一次修改(超好用) |
. 命令是 Vim 的效率核心:做一次操作,然后按 . 重复,配合 n、j 等移动可以批量处理。
系统剪贴板
vim
"+yy " 复制当前行到系统剪贴板
"+p " 从系统剪贴板粘贴
检查支持:
bash
vim --version | grep clipboard
若显示 -clipboard,Ubuntu/Debian 安装:
bash
sudo apt install vim-gtk3
粘贴保持格式
从外部粘贴多行代码时缩进常乱,先:
vim
:set paste
粘贴完:
vim
:set nopaste
6. 搜索与替换
搜索
| 命令 | 作用 |
|---|---|
/pattern |
向下搜索 |
?pattern |
向上搜索 |
n / N |
下一个/上一个匹配 |
* / # |
搜索光标下的单词(下/上) |
:noh |
取消高亮 |
设置搜索忽略大小写:
vim
:set ignorecase
:set smartcase " 含大写字母时区分大小写
替换
语法::s/old/new/[flags]
| 命令 | 作用 |
|---|---|
:s/old/new/ |
替换当前行第一个 |
:s/old/new/g |
替换当前行全部 |
:%s/old/new/g |
替换全文 |
:%s/old/new/gc |
全文替换并逐个确认 |
:10,20s/old/new/g |
替换 10-20 行 |
:'<,'>s/old/new/g |
替换可视选区 |
:%s/\<word\>/new/g |
按整词匹配替换 |
:%s/^/ / |
每行行首加两个空格 |
:%s/\s\+$//e |
删除行尾空白 |
可视模式下选中后按
:会自动填入'<,'>,直接写替换即可。
7. 可视模式
| 命令 | 作用 |
|---|---|
v |
字符可视 |
V |
行可视 |
Ctrl+v |
块可视(列编辑) |
gv |
重选上次选区 |
o |
跳到选区另一端 |
常用操作:
vim
v3j " 选中当前行及下面 3 行
V " 整行选择
Ctrl+v " 块选择
选中后可用:
| 操作 | 说明 |
|---|---|
y |
复制 |
d |
删除 |
c |
修改 |
> / < |
缩进 |
~ |
切换大小写 |
I |
块选择下在每行行首插入(先 Ctrl+v 选中,再 I,输入后 Esc) |
A |
块选择下在每行行尾追加 |
块编辑经典场景: 给多行同时加注释前缀
vim
Ctrl+v " 选中多行行首
I " 进入插入
// 或 # " 输入注释符
Esc " 应用到所有选中行
8. 多文件、多窗口与标签页
多文件(buffer)
| 命令 | 作用 |
|---|---|
:e file |
打开文件到新缓冲区 |
:ls / :buffers |
列出缓冲区 |
:b n |
切换到第 n 个缓冲区 |
:bn / :bp |
下一个/上一个缓冲区 |
:bd |
关闭当前缓冲区 |
:bdelete! |
强制关闭 |
分屏
| 命令 | 作用 |
|---|---|
:sp file |
水平分屏 |
:vsp file |
垂直分屏 |
Ctrl+w s |
水平分屏 |
Ctrl+w v |
垂直分屏 |
Ctrl+w h/j/k/l |
切换到左/下/上/右窗口 |
Ctrl+w w |
循环切换窗口 |
Ctrl+w = |
等分窗口 |
Ctrl+w + / - |
增高/降低 |
Ctrl+w q |
关闭当前窗口 |
Ctrl+w o |
只保留当前窗口 |
标签页
| 命令 | 作用 |
|---|---|
:tabnew file |
新标签页打开 |
gt / gT |
下/上一个标签页 |
ngt |
第 n 个标签页 |
:tabclose |
关闭当前标签页 |
9. 寄存器
Vim 有多个寄存器," 是默认寄存器。
| 寄存器 | 用途 |
|---|---|
"" |
默认(最近一次删除/复制) |
"0 |
最近一次复制(yank) |
"1 ~ "9 |
删除历史(按次数) |
"a ~ "z |
命名寄存器 |
"+ |
系统剪贴板 |
"* |
系统选择区(X11) |
"_ |
黑洞寄存器(不存储) |
"% |
当前文件名 |
": |
最近执行的命令 |
用法:
vim
"ayy " 复制当前行到 a 寄存器
"ap " 粘贴 a 寄存器
"+y " 复制到系统剪贴板
"_dd " 删除但不污染默认寄存器
:reg " 查看所有寄存器
技巧:想删除内容但不覆盖上次复制的内容,用
"_d。
10. 宏:录制与回放
宏用来录制一系列操作并重复执行。
| 命令 | 作用 |
|---|---|
q{reg} |
开始录制到寄存器 reg(如 qa) |
q |
停止录制 |
@{reg} |
回放宏 |
@@ |
重复上次回放 |
n@{reg} |
回放 n 次 |
示例: 给 100 行末尾都加分号
vim
qa " 开始录制到 a
A; " 行尾插入分号
Esc " 回到普通模式
j " 下移一行
q " 停止
100@a " 回放 100 次
批量修改示例: 在每行开头加 //
vim
qa
I//
Esc
j
q
99@a
宏里避免使用会失败的移动命令,否则回放可能中断。可在录制前用
:set nowrapscan等调整行为。
11. 配置文件 .vimrc
Vim 的配置文件:
- Linux/macOS:
~/.vimrc - Windows:
$HOME/_vimrc
推荐基础配置
vim
" ===== 基础设置 =====
set nocompatible " 不兼容 vi
set encoding=utf-8
set fileencoding=utf-8
set number " 显示行号
set relativenumber " 相对行号(配合 j/k 很方便)
set cursorline " 高亮当前行
set showcmd " 显示命令
set wildmenu " 命令行补全
set laststatus=2 " 总是显示状态栏
set ruler " 显示光标位置
set scrolloff=5 " 光标上下保留 5 行
set sidescrolloff=5
" ===== 缩进 =====
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab " Tab 转空格
set autoindent
set smartindent
" ===== 搜索 =====
set ignorecase
set smartcase
set incsearch " 增量搜索
set hlsearch " 高亮结果
" ===== 编辑体验 =====
set backspace=indent,eol,start
set mouse=a " 启用鼠标
set clipboard=unnamedplus " 与系统剪贴板共享(Linux)
" set clipboard=unnamed " macOS 用这个
set splitright
set splitbelow
set noswapfile
set undofile " 持久化撤销
set undodir=~/.vim/undodir
set updatetime=300
" ===== 快捷键 =====
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>l
" 快速保存
inoremap jk <Esc>
inoremap jk <Esc>让插入模式下输入jk快速退出,比按 Esc 顺手。注意它会占用jk组合,某些语言里可能不便,可换jj。
创建撤销目录:
bash
mkdir -p ~/.vim/undodir
12. 插件管理
Vim 原生插件管理能力有限,常用插件管理器:
vim-plug(推荐,简单稳定)
安装:
bash
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
在 .vimrc 中配置:
vim
call plug#begin('~/.vim/plugged')
Plug 'tpope/vim-sensible'
Plug 'preservim/nerdtree'
Plug 'vim-airline/vim-airline'
Plug 'tpope/vim-surround'
Plug 'tpope/vim-commentary'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'airblade/vim-gitgutter'
call plug#end()
安装插件:
vim
:PlugInstall
:PlugUpdate
:PlugClean
其他选择
- Vundle:老牌,仍在维护
- dein.vim:速度快,配置稍复杂
- vim-packager:轻量
- lazy.nvim:Neovim 生态,不适用于 Vim
13. 高频插件推荐
| 插件 | 作用 |
|---|---|
vim-surround |
快速增删改括号、引号、标签 |
vim-commentary |
gcc 注释行,gc 注释选区 |
nerdtree |
文件树 |
vim-airline |
美化状态栏 |
fzf.vim |
模糊搜索文件、缓冲区、内容 |
vim-gitgutter |
显示 git 改动标记 |
vim-fugitive |
Git 集成 |
nerdcommenter |
注释增强 |
ale / coc.nvim |
语法检查、补全 |
vim-easymotion |
快速跳转 |
emmet-vim |
HTML/CSS 快速编写 |
surround 示例:
vim
cs"' " 双引号改为单引号
cs'" " 单引号改为双引号
ysiw) " 给当前单词加圆括号
ds" " 删除两侧双引号
commentary 示例:
vim
gcc " 注释/取消注释当前行
gc3j " 注释下面 3 行
gc " 可视模式注释选区
14. 高级技巧
14.1 命令行窗口
vim
q: " 打开命令历史窗口,可编辑后回车执行
q/ " 搜索历史
Ctrl+f " 命令行模式下打开历史
14.2 全局命令 :g
vim
:g/pattern/d " 删除所有含 pattern 的行
:g/^$/d " 删除所有空行
:v/pattern/d " 删除所有不含 pattern 的行
:g/pattern/normal dd " 对匹配行执行普通命令
:g/^/m0 " 反转文件行序
14.3 标记(mark)
| 命令 | 作用 |
|---|---|
ma |
在当前位置设标记 a |
| ```a`` | 跳到标记 a |
'a |
跳到标记 a 所在行首 |
:marks |
查看所有标记 |
'' |
跳回上次位置 |
14.4 折叠
| 命令 | 作用 |
|---|---|
zf |
创建折叠(可视模式) |
zo / zc |
打开/关闭折叠 |
za |
切换折叠 |
zR / zM |
打开/关闭所有折叠 |
:set foldmethod=indent |
按缩进折叠 |
:set foldmethod=syntax |
按语法折叠 |
14.5 会话与视图
vim
:mksession ~/session.vim " 保存会话
vim -S ~/session.vim " 恢复会话
.vimrc 中自动保存:
vim
autocmd VimLeave * mksession! ~/.vim/last_session.vim
14.6 高效组合速查
| 组合 | 效果 |
|---|---|
ciw |
修改当前单词(change inner word) |
ci" |
修改引号内内容 |
ca{ |
修改花括号内及其括号 |
di( |
删除括号内内容 |
yaW |
复制整个单词含空格 |
dt, |
删除到逗号前 |
cfx |
修改到字符 x(含) |
3dd |
删除 3 行 |
5yy |
复制 5 行 |
. |
重复上次修改 |
u Ctrl+r |
撤销 / 重做 |
理解操作符 + 文本对象 :
dyc是操作符,iwa"i(ip是文本对象,自由组合即可。
14.7 文本对象速查
| 对象 | 含义 |
|---|---|
iw / aw |
单词 / 单词含空格 |
i" / a" |
引号内 / 含引号 |
i( / a( |
括号内 / 含括号 |
i{ / a{ |
花括号内 / 含花括号 |
it / at |
HTML 标签内 / 含标签 |
ip / ap |
段落内 / 含段落 |
15. 常见问题
Q1:打开文件后不知道怎么退出?
按 Esc,输入 :q 回车。有修改时 :q! 强制退出,或 :wq 保存退出。
Q2:方向键和退格键不工作?
老式 vi 兼容模式导致。在 .vimrc 加 set nocompatible 和 set backspace=indent,eol,start。
Q3:粘贴代码缩进错乱?
先 :set paste,粘贴完 :set nopaste。或使用 "+p 从剪贴板粘贴。
Q4:无法与系统剪贴板互通?
检查 vim --version | grep clipboard。若是 -clipboard,安装 vim-gtk3 或改用 Neovim。
Q5:中文显示乱码?
vim
set encoding=utf-8
set fileencoding=utf-8
set termencoding=utf-8
Q6:如何查看当前文件编码?
vim
:set fileencoding?
Q7:误操作后如何恢复?
u 撤销,Ctrl+r 重做。配置了 undofile 后,即使关闭文件再打开也能撤销。
Q8:如何让 Vim 记住上次打开位置?
在 .vimrc 加:
vim
autocmd BufReadPost *
\ if line("'\"") > 1 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif
16. 总结
Vim 的学习可以分三层:
第一层:活下来
i进入插入,Esc回普通:w保存,:q退出,:q!强退h j k l移动
第二层:高效编辑
yypdduCtrl+r/搜索,:%s///g替换vVCtrl+v可视模式wb0$ggG快速移动- 操作符 + 文本对象:
ciw、di"、ya(
第三层:自动化与定制
- 寄存器
"a、"+ - 宏
qa ... q和@a :g全局命令.vimrc配置与快捷键- 插件扩展(surround、commentary、fzf、NERDTree)
学习建议:
- 每天强迫自己用 Vim 完成真实任务,不要退回鼠标和方向键
- 每周学 1-2 个新命令,加入肌肉记忆
- 遇到重复操作就问:能不能用
.、宏或:g解决 - 配置从简开始,按需增加,别一上来抄几百行
.vimrc
Vim 不是一天学会的,但每学会一个命令,都会在未来几年里持续回报你。
参考资源:
vimtutor:终端内置教程:help:Vim 自带完整文档(:help usr_toc)- Vim 官方文档:https://www.vim.org/docs.php
- Vim Adventures:游戏化学习
awesome-vim:插件与配置汇总
本文基于 Vim 9.x 编写,大部分命令在 vi、Neovim 中同样适用。