
(本文约 8600 字,系统覆盖 Vim 核心架构、三种模式、文本操作、配置优化、插件使用等全维度内容,含 500 + 操作示例,适合零基础开发者到高阶效率用户)

在 IDE(Integrated Development Environment)泛滥的今天,Vim 仍然是全球程序员使用率 并列第四 的编辑器,核心原因:
Vim 的学习曲线是 **「先陡后平」** 的 —— 前 10 小时可能觉得很难用,后 100 小时会发现它是「效率神器」,后 1000 小时会觉得「离开 Vim 就无法编程」。
本文将从零基础开始,系统讲解 Vim 的所有核心功能,无需任何前置知识。
Vim 的核心设计理念是「模式化编辑」—— 不同的操作对应不同的模式,这是 Vim 与其他编辑器的最大区别。
模式名称 | 英文缩写 | 键盘切换方式 | 核心功能 |
|---|---|---|---|
普通模式(命令模式) | Normal | 打开 Vim 默认进入,或从其他模式按Esc键 | 文本浏览、复制、粘贴、删除、查找、替换等核心操作 |
插入模式(输入模式) | Insert | 普通模式下按i/I/a/A/o/O键 | 文本输入 |
命令行模式(尾行模式、编辑模式) | Command Line | 普通模式下按:///?键 | 文件保存、退出、查找、替换、配置等高级操作 |

Esc键返回普通模式(推荐按两次Esc确保返回)2.3.1 启动 Vim
# 启动Vim并打开指定文件
vim filename.txt
# 启动Vim并打开空文件
vim
# 启动Vim并显示行号
vim -n filename.txt
# 启动Vim并直接进入插入模式
vim -c "startinsert" filename.txt2.3.2 退出 Vim(普通模式下执行)
# 保存并退出
:wq 或 ZZ(大写Z两次)
# 保存不退出
:w
# 强制保存并退出(忽略文件权限)
:wq!
# 不保存直接退出
:q
# 强制不保存退出(文件已修改但未保存)
:q!普通模式是 Vim 的最常用模式,90% 的文本操作都在普通模式下完成,包括浏览、复制、粘贴、删除、撤销、重做等。
Vim 的光标移动无需鼠标,所有操作都通过键盘完成,以下是最常用的移动命令:
3.1.1 基础移动
h 或 左箭头 → 向左移动一个字符
j 或 下箭头 → 向下移动一行
k 或 上箭头 → 向上移动一行
l 或 右箭头 → 向右移动一个字符3.1.2 高级移动
w → 移动到下一个单词的开头
W → 移动到下一个单词的开头(忽略标点符号)
e → 移动到当前单词的结尾
E → 移动到当前单词的结尾(忽略标点符号)
b → 移动到上一个单词的开头
B → 移动到上一个单词的开头(忽略标点符号)
^ → 移动到当前行的第一个非空白字符
0 → 移动到当前行的开头
$ → 移动到当前行的结尾
g_ → 移动到当前行的最后一个非空白字符
gg → 移动到文件开头
G → 移动到文件结尾
nG → 移动到第n行(如5G移动到第5行)
:n → 命令行模式下移动到第n行(如:5移动到第5行)
Ctrl+f → 向下翻一页(forward)
Ctrl+b → 向上翻一页(backward)
Ctrl+d → 向下翻半页(down)
Ctrl+u → 向上翻半页(up)
H → 移动到当前屏幕的顶部(Head)
M → 移动到当前屏幕的中间(Middle)
L → 移动到当前屏幕的底部(Lower)Vim 的删除命令通常以d开头(delete),删除的内容会自动放入 Vim 的剪贴板,可以通过粘贴命令恢复。
3.2.1 基础删除
x → 删除当前光标所在的字符(相当于Del键)
X → 删除当前光标前的字符(相当于Backspace键)
dd → 删除当前行(核心命令!)
D → 删除从当前光标到行尾的内容(相当于C$)
dl → 删除当前光标所在的字符(同x)
dh → 删除当前光标前的字符(同X)3.2.2 高级删除(结合移动命令)
dw → 删除从当前光标到下一个单词开头的内容
dW → 删除从当前光标到下一个单词开头的内容(忽略标点)
de → 删除从当前光标到当前单词结尾的内容
dE → 删除从当前光标到当前单词结尾的内容(忽略标点)
db → 删除从当前光标到上一个单词开头的内容
dB → 删除从当前光标到上一个单词开头的内容(忽略标点)
d0 → 删除从当前光标到行首的内容
d$ → 删除从当前光标到行尾的内容
d^ → 删除从当前光标到行首非空白字符的内容
dgg → 删除从当前光标到文件开头的内容
dG → 删除从当前光标到文件结尾的内容
dnG → 删除从当前光标到第n行的内容
dH → 删除从当前光标到屏幕顶部的内容
dL → 删除从当前光标到屏幕底部的内容3.2.3 可视化删除
v → 进入可视化模式(按字符选择),移动光标选择内容后按d删除
V → 进入可视化模式(按行选择),移动光标选择内容后按d删除
Ctrl+v → 进入块可视化模式,移动光标选择块后按d删除Vim 的复制命令通常以y开头(yank),复制的内容会放入 Vim 的剪贴板。
3.3.1 基础复制
yy → 复制当前行(核心命令!)
Y → 复制当前行(同yy)
yl → 复制当前光标所在的字符
yh → 复制当前光标前的字符3.3.2 高级复制(结合移动命令)
yw → 复制从当前光标到下一个单词开头的内容
yW → 复制从当前光标到下一个单词开头的内容(忽略标点)
ye → 复制从当前光标到当前单词结尾的内容
yE → 复制从当前光标到当前单词结尾的内容(忽略标点)
yb → 复制从当前光标到上一个单词开头的内容
yB → 复制从当前光标到上一个单词开头的内容(忽略标点)
y0 → 复制从当前光标到行首的内容
y$ → 复制从当前光标到行尾的内容
y^ → 复制从当前光标到行首非空白字符的内容
ygg → 复制从当前光标到文件开头的内容
yG → 复制从当前光标到文件结尾的内容
ynG → 复制从当前光标到第n行的内容
yH → 复制从当前光标到屏幕顶部的内容
yL → 复制从当前光标到屏幕底部的内容3.3.3 可视化复制
v → 进入可视化模式,选择内容后按y复制
V → 进入可视化模式(按行),选择内容后按y复制
Ctrl+v → 进入块可视化模式,选择块后按y复制Vim 的粘贴命令通常以p或P开头,粘贴的是 Vim 剪贴板中的内容。
3.4.1 基础粘贴
p → 粘贴到当前光标之后(行级粘贴则粘贴到当前行之后)
P → 粘贴到当前光标之前(行级粘贴则粘贴到当前行之前)3.4.2 高级粘贴
# 粘贴多次(普通模式下输入数字n后按p/P)
3p → 粘贴3次
5P → 向前粘贴5次
# 块粘贴(用于多列文本的粘贴)
Ctrl+v → 选择块后按y复制,然后移动到目标位置按p粘贴u → 撤销上一步操作(核心命令!)
Ctrl+r → 重做上一步撤销的操作
:undo n → 撤销n步操作
:redo n → 重做n步操作
U → 撤销对当前行的所有修改(注意:仅当光标未离开当前行时有效)# 单个字符替换
r → 普通模式下按r键,然后输入新字符,替换当前光标所在的字符
# 行内替换
R → 进入替换模式,从当前光标开始替换字符,按Esc返回普通模式
# 修改命令(删除+插入模式)
c → 进入修改模式的前缀命令,结合移动命令使用
cw → 修改从当前光标到下一个单词开头的内容(删除后进入插入模式)
cW → 修改从当前光标到下一个单词开头的内容(忽略标点)
ce → 修改从当前光标到当前单词结尾的内容
cE → 修改从当前光标到当前单词结尾的内容(忽略标点)
cb → 修改从当前光标到上一个单词开头的内容
cB → 修改从当前光标到上一个单词开头的内容(忽略标点)
c0 → 修改从当前光标到行首的内容
c$ → 修改从当前光标到行尾的内容
cc → 修改当前行(删除后进入插入模式)
C → 修改从当前光标到行尾的内容(同c$)
# 重复执行上一个命令
. → 普通模式下按.键,重复执行上一个修改命令(核心效率命令!)插入模式仅用于文本输入,输入完成后必须立即按Esc返回普通模式。Vim 提供了多种进入插入模式的方式,以便快速定位输入位置。
命令 | 功能 |
|---|---|
i | 在当前光标之前插入文本 |
I | 在当前行的第一个非空白字符之前插入文本 |
a | 在当前光标之后插入文本 |
A | 在当前行的结尾插入文本(核心命令!) |
o | 在当前行之下插入新行并进入插入模式 |
O | 在当前行之上插入新行并进入插入模式(核心命令!) |
gi | 直接跳转到上次离开插入模式的位置并进入插入模式 |
Ctrl+h → 退格删除当前光标前的字符(同Backspace)
Ctrl+w → 删除当前光标前的一个单词
Ctrl+u → 删除从当前光标到行首的内容
Ctrl+j → 换行(同Enter键)
Ctrl+m → 换行(同Enter键)
Ctrl+[ → 返回普通模式(同Esc键)命令行模式用于执行一次性的高级命令,如文件保存、退出、查找、替换、配置等,所有命令都以:///?开头,执行完成后自动返回普通模式。
# 保存文件
:w [filename] → 保存当前文件,可指定新文件名(另存为)
:w! → 强制保存(忽略文件权限)
:saveas [filename] → 另存为指定文件名
# 退出Vim
:q → 退出Vim(文件未修改)
:q! → 强制退出(文件已修改但未保存)
:wq → 保存并退出
:wq! → 强制保存并退出
:x → 保存并退出(同:wq,但仅在文件修改时保存)
# 打开新文件
:e [filename] → 在当前Vim窗口打开新文件
:sp [filename] → 水平分割窗口打开新文件
:vs [filename] → 垂直分割窗口打开新文件
# 切换文件
:bn → 切换到下一个打开的文件
:bp → 切换到上一个打开的文件
:bd → 关闭当前打开的文件5.2.1 文本查找
# 正向查找
/keyword → 普通模式下按/,输入关键词后按Enter,查找关键字keyword
n → 跳转到下一个匹配
N → 跳转到上一个匹配
# 反向查找
?keyword → 普通模式下按?,输入关键词后按Enter,反向查找关键字keyword
n → 跳转到上一个匹配
N → 跳转到下一个匹配
# 查找当前光标所在的单词
* → 正向查找当前光标所在的单词
# → 反向查找当前光标所在的单词
# 高亮查找结果
:set hlsearch → 开启查找结果高亮
:nohlsearch → 关闭查找结果高亮
:hlsearch! → 切换查找结果高亮5.2.2 文本替换
核心语法::[range]s/old/new/flags
range:替换的范围(如%表示所有行,1,10表示第 1 到 10 行)old:要替换的旧文本(支持正则表达式)new:要替换的新文本flags:替换的选项(如g表示全局替换,i表示忽略大小写)# 替换当前行的第一个匹配
:s/old/new
# 替换当前行的所有匹配
:s/old/new/g
# 替换第1到10行的第一个匹配
:1,10s/old/new
# 替换第1到10行的所有匹配
:1,10s/old/new/g
# 替换所有行的第一个匹配
:%s/old/new
# 替换所有行的所有匹配(核心命令!)
:%s/old/new/g
# 替换所有行的所有匹配,并忽略大小写
:%s/old/new/gi
# 替换所有行的所有匹配,并显示替换确认
:%s/old/new/gc
# 确认选项:y(替换)/n(不替换)/a(替换所有)/q(退出)/l(替换当前并退出)
# 正则表达式替换示例(删除所有注释)
:%s/^#.*$//g → 删除所有以#开头的注释行
:%s/\/\/.*$//g → 删除所有//开头的单行注释# 窗口分割
:sp → 水平分割当前窗口(split)
:vs → 垂直分割当前窗口(vsplit)
:sp [filename] → 水平分割并打开新文件
:vs [filename] → 垂直分割并打开新文件
# 窗口切换
Ctrl+w h → 切换到左侧窗口
Ctrl+w j → 切换到下方窗口
Ctrl+w k → 切换到上方窗口
Ctrl+w l → 切换到右侧窗口
Ctrl+w w → 循环切换窗口
# 窗口大小调整
Ctrl+w + → 增加当前窗口高度
Ctrl+w - → 减少当前窗口高度
Ctrl+w < → 减少当前窗口宽度
Ctrl+w > → 增加当前窗口宽度
:resize 50 → 设置当前窗口高度为50行
:vertical resize 100 → 设置当前窗口宽度为100列
# 标签页操作
:tabnew [filename] → 新建标签页并打开文件
:tabn → 切换到下一个标签页
:tabp → 切换到上一个标签页
:tabclose → 关闭当前标签页
:tabonly → 关闭除当前标签页外的所有标签页# 显示行号
:set number 或 :set nu
# 隐藏行号
:set nonumber 或 :set nonu
# 显示相对行号
:set relativenumber 或 :set rnu
# 自动缩进
:set autoindent 或 :set ai
:set smartindent 或 :set si(智能缩进)
# 语法高亮
:set syntax on
:set syntax off
# 显示光标位置
:set ruler → 显示光标所在的行号和列号
:set noruler → 隐藏光标位置
# 搜索忽略大小写
:set ignorecase 或 :set ic
:set noignorecase 或 :set noic
# 智能搜索(忽略大小写,除非包含大写字母)
:set smartcase 或 :set scsVim 的配置文件是~/.vimrc(Linux/macOS)或 **% USERPROFILE%.vimrc**(Windows),通过修改配置文件可以实现 Vim 的个性化定制。
" 显示行号
set number
" 显示相对行号
set relativenumber
" 自动缩进
set autoindent
" 智能缩进
set smartindent
" 语法高亮
syntax on
" 搜索忽略大小写
set ignorecase
" 智能搜索
set smartcase
" 高亮搜索结果
set hlsearch
" 显示光标位置
set ruler
" 自动换行
set wrap
" 光标移动到行尾自动跳转到下一行
set whichwrap+=<,>,[,]
" 保存时自动创建备份文件
set backup
" 备份文件后缀
set backupcopy=yes
" 临时文件目录
set directory=~/.vim/tmp
" 搜索时实时预览
set incsearch
" 命令行高度
set cmdheight=2Vim 支持自定义快捷键,通过map命令可以将复杂的操作映射为简单的快捷键。
6.2.1 普通模式快捷键映射
" 将空格键映射为leader键(默认是\)
let mapleader = " "
" 保存文件(普通模式下按leader+w)
nnoremap <leader>w :w<CR>
" 保存并退出(普通模式下按leader+q)
nnoremap <leader>q :wq<CR>
" 不保存退出(普通模式下按leader+Q)
nnoremap <leader>Q :q!<CR>
" 关闭查找结果高亮(普通模式下按leader+h)
nnoremap <leader>h :nohlsearch<CR>
" 快速切换到下一个单词
nnoremap <leader>j 3j
" 快速切换到上一个单词
nnoremap <leader>k 3k
" 水平分割窗口
nnoremap <leader>s :sp<CR>
" 垂直分割窗口
nnoremap <leader>v :vs<CR>6.2.2 插入模式快捷键映射
" 插入模式下按Ctrl+s保存文件
inoremap <C-s> <Esc>:w<CR>a
" 插入模式下按Ctrl+q退出插入模式
inoremap <C-q> <Esc>Vim 通过插件管理器可以扩展为 IDE 级别的功能,常用的插件管理器有Vundle和Pathogen,以下是一些必装的插件:
6.3.1 插件管理器安装(Vundle)
# 安装Vundle
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim6.3.2 必装插件配置
" Vundle配置
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" 必装插件
Plugin 'VundleVim/Vundle.vim'
Plugin 'scrooloose/nerdtree' " 文件树
Plugin 'tpope/vim-fugitive' " Git集成
Plugin 'vim-airline/vim-airline' " 状态栏
Plugin 'vim-airline/vim-airline-themes' " 状态栏主题
Plugin 'ctrlpvim/ctrlp.vim' " 文件搜索
Plugin 'tpope/vim-commentary' " 快速注释
call vundle#end()
filetype plugin indent on
" NerdTree配置:普通模式下按leader+n打开文件树
map <leader>n :NERDTreeToggle<CR>
" CtrlP配置:普通模式下按Ctrl+p打开文件搜索
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'
" 快速注释配置:普通模式下按gc注释/取消注释
let g:commentary_map = 'gc'宏录制是Vim 的终极效率武器,可以将一系列操作录制下来,然后重复播放。
# 录制宏
q<register> → 普通模式下按q,然后输入寄存器名称(如a),开始录制
# 执行要录制的操作
# 停止录制
q → 普通模式下按q,停止录制
# 播放宏
@<register> → 普通模式下按@,然后输入寄存器名称(如@a),播放宏
n@<register> → 播放n次宏(如5@a播放5次)
@@ → 播放上一次使用的宏示例:批量为 100 行文本添加注释
1. 移动到第1行:gg
2. 开始录制宏:qa
3. 进入插入模式并添加注释:I#
4. 返回普通模式:Esc
5. 向下移动一行:j
6. 停止录制:q
7. 播放宏100次:100@a文本对象是Vim 的高级操作单元,可以对「单词、句子、段落、括号、引号」等进行操作。
# 单词文本对象
iw → 内部单词(不包含前后空格)
aw → 一个完整的单词(包含前后空格)
# 句子文本对象
is → 内部句子(不包含句号和空格)
as → 一个完整的句子(包含句号和空格)
# 段落文本对象
ip → 内部段落(不包含前后空行)
ap → 一个完整的段落(包含前后空行)
# 括号文本对象
i( → 内部括号(()内的内容,不含括号)
a( → 一个完整的括号(含括号)
i[ → 内部中括号
a[ → 完整的中括号
i{ → 内部大括号
a{ → 完整的大括号
# 引号文本对象
i" → 内部双引号(不含引号)
a" → 完整的双引号(含引号)
i' → 内部单引号
a' → 完整的单引号
# 示例操作
diw → 删除内部单词
yap → 复制完整的段落
cip → 修改内部段落Vim 是远程开发的唯一选择,所有 Linux 服务器默认安装 Vim,以下是远程开发的技巧:
# 本地编辑远程文件
vim scp://user@server:/path/to/file.txt
# 使用sshfs挂载远程目录
sshfs user@server:/path/to/dir ~/local/dir
vim ~/local/dir/file.txt# Vim内置教程
vimtutor → 打开Vim的内置教程,包含所有核心功能的练习
# 官方文档
:help → Vim命令行模式下按:help,打开官方文档
:help <command> → 查看特定命令的帮助(如:help dd)Vim 的核心设计哲学是 **「让手指尽可能少地移动」—— 所有常用命令都被设计在键盘的中央区域(hjkl 光标移动),避免了手指在键盘上的大范围移动,从而实现了极致的编辑效率 **。
学习 Vim 不是为了「秀操作」,而是为了让编辑器成为你思想的延伸,当你不再需要思考 Vim 的操作时,你就真正成为了 Vim 的主人。