外观
从「怎么退出!」到「真香」:Vim 配置与使用指南
Vim 是一个强大的文本编辑器,通过合理的配置和插件,可以打造成一个高效的开发环境。本文将详细介绍我的 Vim 配置,包括基础设置、快捷键映射和插件使用。
Vim Script 基础
在深入配置之前,先了解 Vim Script 的基本语法,有助于读懂和编写 .vimrc 配置文件。
特殊键表示
在映射命令中,特殊键用尖括号 <> 包裹表示:
| 符号 | 含义 |
|---|---|
<CR> | 回车键(Enter) |
<Esc> | Esc 键 |
<Space> | 空格键 |
<Tab> | Tab 键 |
<BS> | 退格键(Backspace) |
<C-x> | Ctrl+x |
<A-x> | Alt+x |
<S-x> | Shift+x |
<leader> | Leader 键(见下文) |
<localleader> | LocalLeader 键(插件局部 Leader) |
<left> / <right> / <up> / <down> | 方向键 |
例如 :w<CR> 表示输入 :w 后按下回车,即执行保存命令。
Leader 键
Leader 键是 Vim 自定义快捷键的命名空间前缀,默认为 \,通常改为空格或逗号:
let mapleader=" "在映射中写 <leader>y 表示"Leader 键 + y",即 空格 + y。
映射命令:map 系列
Vim 有多种映射命令,区别在于作用模式和是否递归:
| 命令 | 作用模式 | 是否递归 |
|---|---|---|
map | 普通、可视、操作符等模式 | 是 |
noremap | 普通、可视、操作符等模式 | 否 |
nnoremap | 普通模式(Normal) | 否 |
vnoremap | 可视模式(Visual) | 否 |
inoremap | 插入模式(Insert) | 否 |
cnoremap | 命令行模式(Command) | 否 |
xnoremap | 可视模式(不含选择模式) | 否 |
nmap | 普通模式 | 是 |
vmap | 可视模式 | 是 |
imap | 插入模式 | 是 |
递归 vs 非递归:
" 递归映射(危险):如果 j 本身也被映射,会触发链式调用
map j k
" 非递归映射(推荐):始终映射到 Vim 原生的 k
noremap j k实际配置中几乎总应使用非递归版本(nnoremap、vnoremap 等),以避免意外的递归展开。
基本语法
" 这是注释(双引号开头)
" 设置选项
set number " 显示行号
set option=value " 带值的选项
" 定义变量
let g:var = 1 " 全局变量(g:)
let s:var = 1 " 脚本局部变量(s:)
let b:var = 1 " 缓冲区变量(b:)
" 条件判断
if condition
" ...
endif基础配置
缩进配置
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set autoindent
set smartindent
set cindent
set cinoptions=g0这些设置确保了一致的代码缩进:
expandtab:将 Tab 转换为空格tabstop=4:Tab 显示为 4 个空格宽度shiftwidth=4:自动缩进使用 4 个空格softtabstop=4:按 Tab 键插入 4 个空格autoindent:自动继承上一行的缩进smartindent:智能缩进cindent:C 语言风格缩进cinoptions=g0:C++ 作用域声明(public/private)不缩进
快捷键映射
快速保存和退出
map W :w<CR>
map Q :q<CR>
map D :q!<CR>
map R :source $MYVIMRC<CR>W:快速保存文件Q:快速退出D:强制退出(不保存)R:重新加载配置文件
平滑滚动
noremap H 5h
noremap J 5j
noremap K 5k
noremap L 5l用h、j、k、l 替代方向键进行移动是 Vim 的精髓,这意味着你的手指不必离开键盘的核心工作区去下面找方向键。 将 H、J、K、L 映射为一次移动 5 个字符/行,既保留了 Vim 的移动逻辑,又提高了移动效率。
搜索配置
set hlsearch
set incsearch
set ignorecase
set smartcase
nnoremap <LEADER><CR> :nohlsearch<CR>hlsearch:高亮搜索结果incsearch:增量搜索(边输入边搜索)ignorecase:搜索时忽略大小写smartcase:如果搜索词包含大写字母,则区分大小写<Leader><CR>:取消搜索高亮
窗口分割
set splitright
set splitbelow
nnoremap z <C-w>w
nnoremap r <C-w>r
nnoremap <left> :vertical resize -5<CR>
nnoremap <right> :vertical resize +5<CR>splitright:垂直分割时新窗口在右侧splitbelow:水平分割时新窗口在下方z:切换到下一个窗口r:旋转窗口布局<left>/<right>:调整窗口宽度
剪贴板集成
vnoremap <leader>y "+y
nnoremap <leader>p "+p
nnoremap <leader>sp :set paste<CR>
nnoremap <leader>np :set nopaste<CR><Leader>y:复制到系统剪贴板<Leader>p:从系统剪贴板粘贴<Leader>sp:启用粘贴模式(避免自动缩进)<Leader>np:禁用粘贴模式
插件管理
我用的插件管理器是 vim-plug ,支持 Github 中的绝大多数 vim 插件。
安装 vim-plug
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim插件列表
call plug#begin()
Plug 'vim-airline/vim-airline'
Plug 'connorholyday/vim-snazzy'
Plug 'jiangmiao/auto-pairs'
Plug 'tpope/vim-commentary'
Plug 'tpope/vim-sensible'
Plug 'tpope/vim-surround'
Plug 'preservim/nerdtree'
Plug 'Xuyuanp/nerdtree-git-plugin'
Plug 'ycm-core/YouCompleteMe'
Plug 'lervag/vimtex'
Plug 'preservim/vim-markdown'
Plug 'iamcco/markdown-preview.nvim', { 'do': 'cd app && npm install' }
Plug 'tpope/vim-fugitive'
Plug 'junegunn/vim-easy-align'
Plug 'wakatime/vim-wakatime'
Plug 'github/copilot.vim'
call plug#end()安装插件:在 Vim 中执行 :PlugInstall
核心插件介绍
1. vim-airline - 状态栏美化
let g:airline#extensions#whitespace#enabled = 0
let g:airline_section_y = ''
let g:airline_section_z = '%l/%L : %c %p%%'Airline 提供了一个美观的状态栏,显示当前行号、列号和文件位置百分比。
2. vim-snazzy - 配色方案
" let g:SnazzyTransparent = 1
color snazzy3. NERDTree - 文件浏览器
nnoremap tt :NERDTreeToggle<CR>
nnoremap tf :NERDTreeFind<CR>tt:打开/关闭文件树tf:在文件树中定位当前文件
NERDTree 提供了一个侧边栏文件浏览器,配合 nerdtree-git-plugin 可以显示 Git 状态:
let g:NERDTreeGitStatusIndicatorMapCustom = {
\ 'Modified' :'✹',
\ 'Staged' :'✚',
\ 'Untracked' :'✭',
\ 'Renamed' :'➜',
\ 'Unmerged' :'═',
\ 'Deleted' :'✖',
\ 'Dirty' :'✗',
\ 'Ignored' :'☒',
\ 'Clean' :'✔︎',
\ 'Unknown' :'?',
\ }
4. YouCompleteMe - 代码补全
nnoremap gd :YcmCompleter GoToDefinitionElseDeclaration<CR>
nnoremap g/ :YcmCompleter GetDoc<CR>
nnoremap gt :YcmCompleter GetType<CR>
let g:ycm_clangd_binary_path = "/usr/bin/clangd-20"YCM 是一个强大的代码补全引擎,支持多种语言
gd:跳转到定义g/:查看文档gt:查看类型信息
安装 YCM:
cd ~/.vim/plugged/YouCompleteMe
python3 install.py --clangd-completer5. vim-surround - 快速编辑包围符号
vim-surround 可以快速添加、修改、删除包围符号(括号、引号等),常用快捷键如下:
cs"':将双引号改为单引号ds":删除双引号ysiw":给当前单词加上双引号yss):给整行加上括号
6. vim-commentary - 快速注释
gcc:注释/取消注释当前行gc:在可视模式下注释选中的行gcap:注释一个段落
7. auto-pairs - 自动配对括号
自动补全括号、引号等配对符号。
8. GitHub Copilot - AI 代码助手
inoremap <C-j> <Plug>(copilot-next)
inoremap <C-k> <Plug>(copilot-previous)
inoremap <C-\> <Plug>(copilot-suggest)Ctrl-j:下一个建议Ctrl-k:上一个建议Ctrl-\:手动触发建议Tab:接受建议
安装 Copilot:
- 在 Vim 中执行
:Copilot setup - 按照提示在浏览器中授权
9. vimtex - LaTeX 支持
let g:maplocalleader = " "
let g:vimtex_compiler_method = 'latexmk'
let g:vimtex_compiler_latexmk_engines = {
\ '_' : '-pdfxe',
\}vimtex 提供了完整的 LaTeX 编辑支持:
<LocalLeader>ll:编译 LaTeX 文档<LocalLeader>lv:查看 PDF<LocalLeader>lc:清理辅助文件<LocalLeader>lt:查看目录
使用 XeLaTeX 引擎编译,支持中文。
10. markdown-preview - Markdown 预览
let g:mkdp_browser = 'firefox'
nnoremap <C-p> :MarkdownPreviewToggle<CR>Ctrl-p:打开/关闭 Markdown 预览
在浏览器中实时预览 Markdown 文档。
11. vim-easy-align - 对齐工具
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)使用示例:
- 选中多行(可视模式)
- 按
ga - 输入对齐字符(如
=、:)
// 对齐前
int a = 1;
int longer_name = 2;
int x = 3;
// 选中后按 ga=,对齐后
int a = 1;
int longer_name = 2;
int x = 3;12. vim-wakatime - 编码时间统计
自动追踪使用vim的编码时间,需要在 WakaTime 注册账号。WakaTime 会生成详细的编码时间统计和分析报告,帮助你了解自己的编码习惯和效率。 
高级功能
自动返回上次编辑位置
autocmd BufReadPost *
\ if line("'\"") >= 1 && line("'\"") <= line("$") && &ft !~# 'commit'
\ | exe "normal! g`\""
\ | endif打开文件时自动跳转到上次编辑的位置。
代码折叠
set foldmethod=marker
set foldmarker={{{,}}}用户可以用 {{{ 和 }}} 自定义折叠区域, 除此之外,Vim 支持对 markdown、LaTeX 等文件类型的自动折叠: 
Tags 支持
set tag=./tags,../tags,../../tags,../../../tags我现在暂时还没搞明白 YCM 的跳转逻辑,:YcmCompleter GoToDefinitionElseDeclaration<CR> 有时候跳转到定义,有时候跳转到声明,感觉不太稳定,所以保留了 ctags 的跳转功能,作为补充。
Vim 配合 ctags 使用,可以快速跳转到函数或变量定义,而且可以自定义跳转的位置。Vim 内置的标签系统需要依赖 ctags 生成的 tags 文件来实现跳转功能。 一个典型的tags文件如下所示,对于每个函数或变量,ctags 会生成一行记录,包含名称、文件路径、搜索模式等信息,如果有很多同名函数,默认会跳转到第一个(可以把自己希望跳转的位置放在重名函数出现的第一行,可定制性很强。),如果想跳转到其他同名函数,可以使用 :tselect 命令,列出所有匹配的标签,然后选择要跳转的那个。

ctags 支持 exclude 功能,用户可以在项目根目录创建一个 .tagsignore 文件,列出不需要生成标签的文件或目录,ctags 在生成 tags 文件时会自动忽略这些文件或目录。
# 生成 tags 文件
ctags --exclude=@.tagsignore -R .在 Vim 中:
Ctrl-]:跳转到定义Ctrl-t:返回
使用技巧
1. 搜索和替换
" 搜索
/pattern
" 替换当前行
:s/old/new/g
" 替换全文
:%s/old/new/g
" 替换并确认
:%s/old/new/gc2. 宏录制
qa " 开始录制到寄存器 a
... " 执行操作
q " 停止录制
@a " 执行宏
100@a " 执行 100 次3. 可视块模式
Ctrl-v 进入可视块模式,可以进行列编辑:
Ctrl-v " 进入可视块模式
选择区域
I " 在选中列前插入
输入内容
Esc " 应用到所有行总结
这套 Vim 配置经过长期使用和调整,基本涵盖了我日常开发的各个方面:
- 基础配置:合理的缩进、搜索和窗口管理
- 快捷键:高效的移动和编辑操作
- 代码补全:YCM + Copilot 提供强大的智能补全
- 文件管理:NERDTree 提供直观的文件浏览
- 多语言支持:LaTeX、Markdown、C/C++ 等
Vim 的学习曲线虽然陡峭,但其凭借高度可定制性、丰富的插件生态、可以帮你摆脱鼠标的丰富的快捷键,一旦掌握,可以大大提高编辑效率。如果我后续有新的配置或插件,我会继续更新这篇文章。我的完整配置文件在 Github/templates 中可以找到,希望对你也有所帮助!
版权所有
版权归属:Guisong Wu