Vim 编辑器完全指南:从入门到精通
24 min read
#vim#editor#productivity#terminal
Vim 简介
Vim (Vi IMproved) 是一个高度可配置、功能强大的文本编辑器,广泛用于编程和系统管理。它以其高效的编辑模式和强大的键盘操作而闻名,让开发者能够不离开键盘就能完成所有编辑操作。
为什么选择 Vim?
- 效率至上:通过键盘快捷键完成所有操作,无需频繁切换到鼠标
- 无处不在:几乎所有 Unix/Linux 系统都预装了 Vi/Vim
- 高度可定制:通过配置文件和插件系统打造专属编辑环境
- 学习曲线友好:掌握基础后可以逐步学习高级功能
- 社区活跃:拥有丰富的插件和配置资源
Vim 的哲学
Vim 的设计理念是"模式编辑"。不同模式下,键盘按键有不同的功能,这使得编辑操作更加高效和精准。
Vim 模式详解
Vim 有多种工作模式,每种模式都有特定的用途:
1. 普通模式 (Normal Mode)
这是 Vim 启动时的默认模式,用于导航和执行命令。
# 从其他模式返回普通模式
按 Esc 键
2. 插入模式 (Insert Mode)
用于输入和编辑文本,类似普通文本编辑器。
# 进入插入模式的常用方式
i # 在光标前插入
a # 在光标后插入
I # 在行首插入
A # 在行尾插入
o # 在下方新建一行并插入
O # 在上方新建一行并插入
3. 可视模式 (Visual Mode)
用于选择文本块,然后进行操作(复制、删除等)。
v # 进入字符可视模式(逐字符选择)
V # 进入行可视模式(逐行选择)
Ctrl+v # 进入块可视模式(块状选择)
4. 命令模式 (Command Mode)
用于执行 Ex 命令(如保存、退出、搜索替换等)。
: # 从普通模式进入命令模式
5. 替换模式 (Replace Mode)
直接覆盖文本而不是插入。
R # 进入替换模式
r # 替换单个字符
基础导航和移动
掌握 Vim 的导航是提高效率的第一步。
基本光标移动
h # 左移一个字符
j # 下移一行
k # 上移一行
l # 右移一个字符
# 也可以使用方向键,但 hjkl 更高效
单词级移动
w # 移动到下一个单词开头
b # 移动到上一个单词开头
e # 移动到当前单词结尾
W # 移动到下一个空格分隔的"单词"开头
B # 移动到上一个空格分隔的"单词"开头
E # 移动到当前空格分隔的"单词"结尾
行内移动
0 # 移动到行首
^ # 移动到行首第一个非空字符
$ # 移动到行尾
fx # 跳转到下一个字符 x
Fx # 跳转到上一个字符 x
tx # 跳转到下一个字符 x 之前
Tx # 跳转到上一个字符 x 之后
; # 重复上一次 f/F/t/T 操作
, # 反向重复上一次 f/F/t/T 操作
行间移动
gg # 跳转到文件开头
G # 跳转到文件结尾
:n # 跳转到第 n 行
nG # 跳转到第 n 行
屏幕移动
Ctrl+f # 向下翻页
Ctrl+b # 向上翻页
Ctrl+d # 向下翻半页
Ctrl+u # 向上翻半页
H # 移动到屏幕顶部
M # 移动到屏幕中间
L # 移动到屏幕底部
编辑命令
Vim 的编辑命令遵循"操作符 + 动作"的语法模式。
删除操作
x # 删除光标处字符
X # 删除光标前字符
dd # 删除当前行
dw # 删除到下一个单词开头
diw # 删除光标所在的单词
d$ # 删除到行尾
d0 # 删除到行首
dG # 删除到文件结尾
dgg # 删除到文件开头
# 可视模式删除
v + 选择范围 + d # 删除选中的内容
复制和粘贴
yy # 复制当前行
yw # 复制到下一个单词开头
y$ # 复制到行尾
yi" # 复制引号内的内容
yi( # 复制括号内的内容
| 寄存器 | 说明 |
|---|---|
| "" | 无名寄存器(默认) |
| "0 | 复制专用寄存器 |
| "+ | 系统剪贴板 |
| "* | 选择缓冲区 |
| "a-"z | 命名寄存器 |
# 使用寄存器
"ayy # 复制当前行到寄存器 a
"ap # 粘贴寄存器 a 的内容
"+yy # 复制到系统剪贴板
"+p # 从系统剪贴板粘贴
修改操作
cw # 删除到单词结尾并进入插入模式
cc # 删除整行并进入插入模式
C # 删除到行尾并进入插入模式
s # 删除字符并进入插入模式
S # 删除行并进入插入模式
撤销和重做
u # 撤销上一次操作
Ctrl+r # 重做
U # 撤销对当前行的所有修改
重复操作
. # 重复上一次操作
3dd # 删除 3 行
5yy # 复制 5 行
3w # 向前移动 3 个单词
文件操作
保存和退出
:w # 保存当前文件
:wq # 保存并退出
:q # 退出(未修改时)
:q! # 强制退出,不保存修改
:x # 保存并退出(等同于 :wq)
ZZ # 保存并退出(快捷键)
ZQ # 不保存退出(快捷键)
文件管理
:e filename # 编辑文件
:e! # 重新加载当前文件(放弃修改)
:w filename # 另存为
:bn # 切换到下一个缓冲区
:bp # 切换到上一个缓冲区
:ls # 列出所有缓冲区
:b n # 切换到缓冲区 n
搜索和替换
基本搜索
/pattern # 向下搜索 pattern
?pattern # 向上搜索 pattern
n # 跳转到下一个搜索结果
N # 跳转到上一个搜索结果
* # 搜索光标下的单词(向下)
# # 搜索光标下的单词(向上)
高级搜索
\cpattern # 忽略大小写搜索
\Cpattern # 区分大小写搜索
/^pattern # 搜索行首
/pattern$ # 搜索行尾
替换操作
:s/old/new/ # 替换当前行第一个匹配
:s/old/new/g # 替换当前行所有匹配
:%s/old/new/g # 替换整个文件所有匹配
:%s/old/new/gc # 全局替换,每次都询问确认
:n,ms/old/new/g # 替换第 n 到 m 行
:%s/old/new/gi # 全局替换,忽略大小写
# 特殊字符需要转义
:s/\//\\\//g # 替换 / 为 \/
高级功能
分割窗口
:split # 水平分割窗口
:vsplit # 垂直分割窗口
:sp filename # 水平分割并打开文件
:vsp filename # 垂直分割并打开文件
Ctrl+w s # 水平分割
Ctrl+w v # 垂直分割
# 窗口导航
Ctrl+w h # 移动到左边的窗口
Ctrl+w j # 移动到下边的窗口
Ctrl+w k # 移动到上边的窗口
Ctrl+w l # 移动到右边的窗口
Ctrl+w w # 切换到下一个窗口
Ctrl+w p # 切换到上一个窗口
# 窗口调整
Ctrl+w = # 均匀分配窗口大小
Ctrl+w + # 增加窗口高度
Ctrl+w - # 减少窗口高度
Ctrl+w > # 增加窗口宽度
Ctrl+w < # 减少窗口宽度
Ctrl+w q # 关闭当前窗口
标签页
:tabnew # 新建标签页
:tabnew file # 在新标签页打开文件
:tabn # 切换到下一个标签页
:tabp # 切换到上一个标签页
:tabc # 关闭当前标签页
:tabo # 关闭其他所有标签页
:tabs # 列出所有标签页
gt # 切换到下一个标签页
gT # 切换到上一个标签页
n_gt # 切换到第 n 个标签页
书签功能
ma # 在当前位置设置标记 a
'a # 跳转到标记 a
'ma # 跳转到标记 a(光标定位到设置标记时的位置)
``a # 跳转到标记 a(光标定位到设置标记时的行的开头)
:marks # 列出所有标记
宏录制
qa # 开始录制宏到寄存器 a
q # 停止录制
@a # 执行宏 a
@@ # 重复上次执行的宏
5@a # 执行宏 a 五次
:reg a # 查看寄存器 a 的内容
宏录制示例:在多行行首添加注释
# 1. 移动到第一行
# 2. qa (开始录制)
# 3. I (进入行首插入模式)
# 4. # (输入 #)
# 5. Esc (返回普通模式)
# 6. j (下移一行)
# 7. q (停止录制)
# 8. 100@a (在接下来 100 行重复操作)
实用开发工作流
代码格式化
gg=G # 格式化整个文件
= # 在可视模式下格式化选中内容
代码折叠
zi # 切换折叠
za # 切换当前折叠
zR # 打开所有折叠
zM # 关闭所有折叠
zc # 折叠当前块
zo # 展开当前块
自动补全
Ctrl+n # 下一个匹配的关键字
Ctrl+p # 上一个匹配的关键字
Ctrl+x Ctrl+f # 文件名补全
Ctrl+x Ctrl+] # 标签补全
快速跳转
Ctrl+] # 跳转到光标下单词的定义
Ctrl+t # 返回上一个跳转
Ctrl+o # 跳转到上一个位置
Ctrl+i # 跳转到下一个位置
:g/pattern/ # 跳转到匹配 pattern 的行
外部命令
:!command # 执行外部命令
:r!command # 读取外部命令的输出
:w!command # 将当前内容作为命令输入
# 实用示例
:!ls # 列出当前目录文件
:r!date # 插入当前日期
:w!sudo tee % # 以 sudo 权限保存文件
.vimrc 配置指南
一个良好的 .vimrc 配置能极大提升 Vim 使用体验。
基础配置
" ===== 基础设置 =====
set nocompatible " 不兼容 Vi
set encoding=utf-8 " 编码设置
set fileencoding=utf-8 " 文件编码
set fileencodings=utf-8 " 支持的编码列表
" ===== 界面设置 =====
set number " 显示行号
set relativenumber " 相对行号
set ruler " 显示光标位置
set showcmd " 显示输入的命令
set laststatus=2 " 始终显示状态栏
set cursorline " 高亮当前行
set colorcolumn=80 " 80 列标线
" ===== 缩进设置 =====
set autoindent " 自动缩进
set smartindent " 智能缩进
set tabstop=4 " Tab 键宽度
set shiftwidth=4 " 自动缩进宽度
set expandtab " 用空格替代 Tab
set smarttab " 智能制表符
" ===== 搜索设置 =====
set hlsearch " 高亮搜索结果
set incsearch " 增量搜索
set ignorecase " 忽略大小写
set smartcase " 智能大小写
" ===== 编辑设置 =====
set mouse=a " 启用鼠标
set backspace=indent,eol,start " 退格键行为
set clipboard=unnamed " 使用系统剪贴板
set history=1000 " 命令历史
set undofile " 持久化撤销
set undodir=~/.vim/undo " 撤销文件目录
set backup " 创建备份文件
set backupdir=~/.vim/backup " 备份目录
set directory=~/.vim/swap " 交换文件目录
" ===== 性能设置 =====
set lazyredraw " 宏执行时不重绘
set synmaxcol=200 " 语法高亮最大列数
set ttyfast " 快速终端连接
键位映射
" ===== 键位映射 =====
let mapleader = "," " 设置 Leader 键
" 快捷保存和退出
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
nnoremap <leader>x :x<CR>
" 快速移动
nnoremap j gj
nnoremap k gk
nnoremap ^ ^
nnoremap $ $
" 窗口操作
nnoremap <leader>h <C-w>h
nnoremap <leader>j <C-w>j
nnoremap <leader>k <C-w>k
nnoremap <leader>l <C-w>l
" 清除搜索高亮
nnoremap <leader><space> :nohlsearch<CR>
" 快速编辑配置文件
nnoremap <leader>ev :e $MYVIMRC<CR>
nnoremap <leader>sv :source $MYVIMRC<CR>
" 可视模式缩进
vnoremap < <gv
vnoremap > >gv
" 移动选中的文本
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv
插件管理器设置
使用 vim-plug 管理插件:
# 安装 vim-plug
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
" ===== 插件配置 =====
call plug#begin('~/.vim/plugged')
" 文件管理器
Plug 'preservim/nerdtree'
" 状态栏美化
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
" 主题
Plug 'morhetz/gruvbox'
" 语法高亮
Plug 'sheerun/vim-polyglot'
" 模糊查找
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
" Git 集成
Plug 'tpope/vim-fugitive'
Plug 'airblade/vim-gitgutter'
" 代码补全
Plug 'neoclide/coc.nvim', {'branch': 'release'}
" 括号自动配对
Plug 'jiangmiao/auto-pairs'
" 注释插件
Plug 'tpope/vim-commentary'
" 快速包围
Plug 'tpope/vim-surround'
" 自动对齐
Plug 'junegunn/vim-easy-align'
call plug#end()
" ===== 主题设置 =====
colorscheme gruvbox
set background=dark
安装插件的命令:
:PlugInstall " 安装插件
:PlugUpdate " 更新插件
:PlugClean " 清除未使用的插件
推荐插件配置
NERDTree - 文件树浏览器
" NERDTree 配置
nnoremap <leader>n :NERDTreeToggle<CR>
nnoremap <leader>f :NERDTreeFind<CR>
let NERDTreeShowHidden=1
let NERDTreeIgnore=['\.pyc$', '\.o$', '\.so$', '\.a$', '\.swp', '*\.swp', '\.swo', '*\.swo', '\.git', '\.hg', '\.svn', '\.bzr']
vim-airline - 美化状态栏
" Airline 配置
let g:airline_theme='gruvbox'
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
fzf - 模糊查找
" FZF 配置
nnoremap <leader>p :Files<CR>
nnoremap <leader>b :Buffers<CR>
nnoremap <leader>g :Rg<CR>
coc.nvim - 代码补全
" CoC 配置
" 使用 Tab 进行补全导航
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
" 使用 Enter 确认补全
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
" 使用 Ctrl+space 触发补全
inoremap <silent><expr> <c-space> coc#refresh()
vim-easy-align - 快速对齐
" EasyAlign 配置
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)
常用技巧和窍门
1. 快速选择整个文件内容
ggVG " gg 到开头,V 进入行可视模式,G 到结尾
2. 大小写转换
~ " 切换光标下字符的大小写
gU$ " 将当前行到行尾转为大写
gu$ " 将当前行到行尾转为小写
gUU " 整行大写
guu " 整行小写
3. 快速插入文本
:r !date " 插入当前日期时间
:r !ls " 插入当前目录列表
4. 重复上一次命令
. " 重复上次操作
3. " 重复上次操作 3 次
5. 块选择编辑
# 在多行开头同时添加内容
Ctrl+v " 进入块可视模式
j " 选择多行
Shift+i " 进入插入模式
输入文本
Esc " 等待应用到所有选中行
6. 快速移动到匹配的括号
% " 在 ()、[]、{} 之间跳转
7. 读取命令输出
:r!pwd " 读取并插入当前路径
:r!ls -la " 读取并插入文件列表
8. 会话管理
:mksession " 保存当前会话
:mks! session.vim " 保存到指定文件
:source session.vim " 恢复会话
9. Diff 模式
vimdiff file1 file2 " 以 diff 模式打开两个文件
:diffthis " 将当前窗口设为 diff 模式
:diffoff " 关闭 diff 模式
10. 快速修改大小写
~ " 切换当前字符大小写
gUaw " 将当前单词转为大写
guaw " 将当前单词转为小写
性能优化建议
1. 禁用不必要的功能
syntax off " 禁用语法高亮(在超大文件中)
set noswapfile " 禁用交换文件
set nobackup " 禁用备份文件
2. 优化大文件编辑
" 创建大文件类型自动命令
augroup LargeFile
autocmd!
autocmd BufReadPre * let f=expand("<afile>") | if getfsize(f) > 1024*1024 | setlocal syntax= noswapfile | endif
augroup END
调试和故障排除
查看 Vim 版本和信息
:version " 查看 Vim 版本和编译选项
:verbose map " 查看所有映射及其定义位置
:scriptnames " 查看加载的所有脚本
加载时间分析
--startuptime vim-startup.log
" 在启动 Vim 后,查看 vim-startup.log 分析加载时间
常见问题解决
-
配色方案不显示:
set t_Co=256 " 启用 256 色支持 -
退格键不工作:
set backspace=indent,eol,start -
系统剪贴板不可用:
# 需要安装支持剪贴板的 Vim 版本 sudo apt-get install vim-gtk3 # Ubuntu/Debian brew install vim # macOS
快速参考
基础命令速查表
| 操作 | 命令 | 说明 |
|---|---|---|
| 移动 | h/j/k/l | 左/下/上/右 |
w/b | 下一个/上一个单词 | |
0/$ | 行首/行尾 | |
gg/G | 文件开头/结尾 | |
| 编辑 | i/a | 在光标前/后插入 |
dd | 删除当前行 | |
yy | 复制当前行 | |
p/P | 粘贴到光标后/前 | |
u/Ctrl+r | 撤销/重做 | |
. | 重复上次操作 | |
| 可视模式 | v/V/Ctrl+v | 字符/行/块选择 |
| 搜索 | /pattern | 向前搜索 |
?pattern | 向后搜索 | |
n/N | 下一个/上一个匹配 | |
* | 搜索光标下的单词 | |
| 文件操作 | :w | 保存 |
:q | 退出 | |
:wq | 保存并退出 | |
:e file | 打开文件 | |
| 窗口 | :sp/:vsp | 水平/垂直分割 |
Ctrl+w h/j/k/l | 窗口导航 |
高级命令速查表
| 操作 | 命令 | 说明 |
|---|---|---|
| 替换 | :s/old/new/ | 替换第一个匹配 |
:%s/old/new/g | 全局替换 | |
:%s/old/new/gc | 全局替换(确认) | |
| 宏 | qa | 开始录制宏到寄存器 a |
q | 停止录制 | |
@a | 执行宏 a | |
| 标记 | ma | 设置标记 a |
'a | 跳转到标记 a | |
| 标签页 | :tabnew | 新建标签页 |
gt/gT | 下一个/上一个标签页 | |
| 折叠 | zi | 切换折叠 |
za | 切换当前折叠 | |
zR/zM | 打开/关闭所有折叠 |
键位组合速查表
| 键位组合 | 功能 |
|---|---|
Ctrl+w | 窗口操作前缀 |
Ctrl+] | 跳转到定义 |
Ctrl+t | 返回跳转 |
Ctrl+o | 上一个位置 |
Ctrl+i | 下一个位置 |
Ctrl+f/b | 下/上翻页 |
Ctrl+d/u | 下/上翻半页 |
g+g | 文件开头 |
Shift+k | 查看手册(如果配置) |
Shift+>> | 增加缩进 |
Shift+<< | 减少缩进 |
学习资源
在线教程
- Vim Adventures - 游戏化学习 Vim
- Open Vim - 交互式教程
- Vim Tips Wiki - 技巧大全
官方文档
:help " 查看 Vim 帮助
:help user-manual " 用户手册
:help pattern " 正则表达式帮助
:help autocmd " 自动命令帮助
推荐配置文件
- vim-sensible - 默认设置
- vim-felix - 现代配置
- SpaceVim - 模块化配置
总结
Vim 是一个强大的编辑器,掌握它需要时间和练习。建议的学习路径:
- 第一周:掌握基础模式和基本移动
- 第二周:学习编辑命令和可视模式
- 第三周:配置
.vimrc和安装插件 - 第四周:学习高级功能和自定义配置
记住:
- 每天练习一点,不要贪多
- 先掌握基础,再学习高级功能
- 多用
:help查看文档 - 参考他人的配置,但要理解每个设置
- 慢慢形成自己的编辑习惯
Vim 的学习曲线虽然陡峭,但一旦掌握,它将成为你最强大的编辑工具。坚持练习,你会发现编辑效率的显著提升!
练习题
为了巩固所学知识,建议尝试以下练习:
-
基础练习:
- 创建一个新文件,输入 10 行文本
- 使用不同的移动命令导航
- 练习删除、复制、粘贴操作
- 尝试撤销和重做
-
进阶练习:
- 录制一个宏,在多行行首添加编号
- 使用可视块模式同时编辑多行
- 练习搜索和替换命令
- 尝试分割窗口和标签页操作
-
实战练习:
- 用 Vim 编写一个完整的程序
- 配置你的
.vimrc文件 - 安装并配置 5 个常用插件
- 创建自定义键位映射
祝你学习愉快,早日成为 Vim 高手!