$ terminals _

.vimrc 配置指南

一份面向终端用户的 .vimrc 配置,包含基础设置、快捷键映射与实用插件推荐

简介

.vimrc 是 Vim 编辑器的用户配置文件,位于 ~/.vimrc。通过合理配置,可以将 Vim 从一个基础文本编辑器变为强大的开发工具。本文提供一份实用的配置方案,涵盖基础设置、快捷键映射、搜索优化和插件管理。

完整配置

" ============================================================
" ~/.vimrc — Vim 用户配置文件
" ============================================================

" ---------- 0. 兼容性 ----------
" 关闭 Vi 兼容模式,启用 Vim 的全部功能
set nocompatible
filetype off

" ---------- 1. 插件管理 (vim-plug) ----------
" 自动安装 vim-plug(如果尚未安装)
if empty(glob('~/.vim/autoload/plug.vim'))
  silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
    \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif

call plug#begin('~/.vim/plugged')

" 文件浏览与搜索
Plug 'preservim/nerdtree'              " 文件树浏览器
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }  " 模糊搜索引擎
Plug 'junegunn/fzf.vim'                " fzf 的 Vim 集成

" 编辑增强
Plug 'tpope/vim-surround'              " 快速修改成对符号(引号、括号等)
Plug 'tpope/vim-commentary'            " 快速注释/取消注释
Plug 'tpope/vim-repeat'                " 用 . 重复插件操作
Plug 'jiangmiao/auto-pairs'            " 自动补全括号和引号

" Git 集成
Plug 'tpope/vim-fugitive'              " Git 命令封装
Plug 'airblade/vim-gitgutter'          " 在侧栏显示 Git 变更状态

" 外观与状态栏
Plug 'vim-airline/vim-airline'          " 轻量级状态栏
Plug 'vim-airline/vim-airline-themes'   " 状态栏主题
Plug 'morhetz/gruvbox'                 " Gruvbox 配色方案

" 语法与补全
Plug 'dense-analysis/ale'              " 异步语法检查
Plug 'sheerun/vim-polyglot'            " 多语言语法高亮包

call plug#end()

" ---------- 2. 基础设置 ----------
filetype plugin indent on               " 根据文件类型加载插件和缩进规则
syntax enable                           " 启用语法高亮

set encoding=utf-8                      " 内部编码使用 UTF-8
set fileencoding=utf-8                  " 文件保存编码
set fileencodings=utf-8,gbk,gb2312,big5 " 自动检测文件编码顺序

set number                              " 显示行号
set relativenumber                      " 显示相对行号(方便跳转)
set cursorline                          " 高亮当前行
set signcolumn=yes                      " 始终显示标记列(避免界面抖动)
set scrolloff=8                         " 光标距顶/底部保持 8 行距离
set sidescrolloff=8                     " 水平滚动时保持 8 列距离

set mouse=a                             " 启用鼠标支持(所有模式)
set clipboard=unnamedplus               " 与系统剪贴板共享
set backspace=indent,eol,start          " 退格键可跨行删除

set hidden                              " 允许切换未保存的 buffer
set confirm                             " 关闭未保存文件时弹出确认
set autoread                            " 文件被外部修改后自动重新加载
set updatetime=300                      " 减少刷新延迟(默认 4000ms)

" ---------- 3. 缩进与制表符 ----------
set expandtab                           " 用空格替代 Tab
set tabstop=4                           " Tab 显示为 4 个空格宽度
set shiftwidth=4                        " 自动缩进使用 4 个空格
set softtabstop=4                       " 编辑时 Tab 等于 4 个空格
set smartindent                         " 智能缩进
set autoindent                          " 自动保持缩进

" 针对特定文件类型调整缩进
autocmd FileType html,css,javascript,typescript,json,yaml,vue setlocal tabstop=2 shiftwidth=2 softtabstop=2
autocmd FileType go setlocal noexpandtab tabstop=4 shiftwidth=4

" ---------- 4. 搜索设置 ----------
set hlsearch                            " 高亮搜索结果
set incsearch                           " 增量搜索(边输入边匹配)
set ignorecase                          " 搜索时忽略大小写
set smartcase                           " 如果包含大写字母则区分大小写

" ---------- 5. 外观设置 ----------
set termguicolors                       " 启用 24 位真彩色
set background=dark                     " 使用暗色背景
silent! colorscheme gruvbox             " 设置配色方案(静默处理未安装的情况)

set laststatus=2                        " 始终显示状态栏
set showcmd                             " 在右下角显示未完成的命令
set showmode                            " 显示当前模式
set wildmenu                            " 命令行补全增强菜单
set wildmode=list:longest,full          " 补全模式:先列出最长匹配,再完整循环

set nowrap                              " 默认不自动换行
set linebreak                           " 在单词边界处换行(开启 wrap 时)
set showbreak=>>>                       " 换行标记

" ---------- 6. 文件处理 ----------
set nobackup                            " 不创建备份文件
set nowritebackup                       " 写入时不创建备份
set noswapfile                          " 不创建交换文件

" 持久化撤销历史(关闭文件后仍可撤销)
set undofile
set undodir=~/.vim/undodir
" 确保撤销目录存在
if !isdirectory($HOME . '/.vim/undodir')
    call mkdir($HOME . '/.vim/undodir', 'p')
endif

" 重新打开文件时恢复光标位置
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif

" ---------- 7. Leader 键映射 ----------
" 设置 Leader 键为空格键
let mapleader = " "
let maplocalleader = " "

" 文件操作
nnoremap <leader>w :w<CR>|              " 快速保存
nnoremap <leader>q :q<CR>|              " 快速退出
nnoremap <leader>x :x<CR>|              " 保存并退出

" Buffer 导航
nnoremap <leader>bn :bnext<CR>|         " 下一个 buffer
nnoremap <leader>bp :bprev<CR>|         " 上一个 buffer
nnoremap <leader>bd :bdelete<CR>|       " 关闭当前 buffer
nnoremap <leader>bl :ls<CR>|            " 列出所有 buffer

" 窗口分割与导航
nnoremap <leader>sv :vsplit<CR>|        " 垂直分割
nnoremap <leader>sh :split<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|                  " 跳转到右侧窗口

" 窗口大小调整
nnoremap <C-Up> :resize +2<CR>|         " 增加高度
nnoremap <C-Down> :resize -2<CR>|       " 减少高度
nnoremap <C-Left> :vertical resize -2<CR>|  " 减少宽度
nnoremap <C-Right> :vertical resize +2<CR>| " 增加宽度

" 搜索相关
nnoremap <leader>nh :nohl<CR>|          " 清除搜索高亮
nnoremap <leader>/ :BLines<CR>|         " fzf 搜索当前文件内容

" NERDTree 文件树
nnoremap <leader>e :NERDTreeToggle<CR>| " 切换文件树
nnoremap <leader>nf :NERDTreeFind<CR>|  " 在文件树中定位当前文件

" FZF 模糊搜索
nnoremap <leader>ff :Files<CR>|         " 搜索文件
nnoremap <leader>fg :Rg<CR>|            " 全局内容搜索
nnoremap <leader>fb :Buffers<CR>|       " 搜索 buffer
nnoremap <leader>fh :History<CR>|       " 搜索历史文件
nnoremap <leader>fc :Commands<CR>|      " 搜索命令

" Git 操作 (vim-fugitive)
nnoremap <leader>gs :Git<CR>|           " Git 状态面板
nnoremap <leader>gd :Gdiffsplit<CR>|    " Git diff 分屏
nnoremap <leader>gb :Git blame<CR>|     " Git blame
nnoremap <leader>gl :Git log --oneline -20<CR>| " Git 日志

" ---------- 8. 普通模式快捷键 ----------
" 快速移动整行
nnoremap <A-j> :m .+1<CR>==|            " Alt+j 下移一行
nnoremap <A-k> :m .-2<CR>==|            " Alt+k 上移一行

" 保持视觉居中
nnoremap n nzzzv|                        " 搜索下一个时居中
nnoremap N Nzzzv|                        " 搜索上一个时居中
nnoremap <C-d> <C-d>zz|                 " 半页下滚后居中
nnoremap <C-u> <C-u>zz|                 " 半页上滚后居中

" Y 复制到行末(与 D/C 行为一致)
nnoremap Y y$

" ---------- 9. 可视模式快捷键 ----------
" 可视模式下移动选中行
vnoremap <A-j> :m '>+1<CR>gv=gv|        " Alt+j 下移选中块
vnoremap <A-k> :m '<-2<CR>gv=gv|        " Alt+k 上移选中块

" 缩进后保持选中状态
vnoremap < <gv|                          " 左缩进后重新选中
vnoremap > >gv|                          " 右缩进后重新选中

" ---------- 10. 插入模式快捷键 ----------
" jk 快速退出插入模式
inoremap jk <Esc>

" ---------- 11. 插件配置 ----------
" NERDTree
let NERDTreeShowHidden = 1               " 显示隐藏文件
let NERDTreeMinimalUI = 1                " 简洁界面
let NERDTreeIgnore = ['\.pyc$', '__pycache__', '\.git$', 'node_modules']
" 如果 NERDTree 是最后一个窗口则自动关闭
autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif

" Airline 状态栏
let g:airline_powerline_fonts = 1         " 使用 Powerline 字体
let g:airline#extensions#tabline#enabled = 1  " 顶部显示 buffer 标签
let g:airline#extensions#tabline#formatter = 'unique_tail_improved'
let g:airline_theme = 'gruvbox'

" ALE 语法检查
let g:ale_sign_error = '✗'               " 错误标记
let g:ale_sign_warning = '⚠'             " 警告标记
let g:ale_lint_on_text_changed = 'never'  " 不在输入时检查(节省性能)
let g:ale_lint_on_save = 1               " 保存时检查
let g:ale_fix_on_save = 1                " 保存时自动修复

" GitGutter
let g:gitgutter_sign_added = '+'
let g:gitgutter_sign_modified = '~'
let g:gitgutter_sign_removed = '-'

" FZF
let g:fzf_layout = { 'down': '40%' }     " fzf 窗口位于底部 40%

" ---------- 12. 自动命令 ----------
" 保存时自动删除行末空白
autocmd BufWritePre * :%s/\s\+$//e

" 针对不同文件类型的特殊配置
autocmd FileType markdown setlocal wrap spell spelllang=en_us,cjk
autocmd FileType gitcommit setlocal spell spelllang=en_us textwidth=72

" 打开终端时自动进入插入模式
autocmd TermOpen * startinsert

配置说明

基础设置

nocompatible 是所有现代 Vim 配置的起点,关闭后 Vim 不再尝试兼容 Vi 的行为。numberrelativenumber 同时启用会在当前行显示绝对行号,其余行显示相对行号,方便使用 5j10k 等命令快速跳转。

缩进策略

默认使用 4 个空格作为缩进,同时通过 autocmd 为前端文件(HTML/CSS/JS/JSON/YAML)切换为 2 个空格,Go 语言则使用 Tab 缩进。这种按文件类型差异化的配置能避免团队协作中的格式冲突。

搜索优化

ignorecase 配合 smartcase 实现了智能大小写匹配:全小写搜索时忽略大小写,一旦输入包含大写字母则自动切换为精确匹配。incsearch 提供所见即所得的搜索体验。

Leader 键

空格键作为 Leader 键是目前最流行的选择,因为它是键盘上最大、最容易触及的键。所有自定义快捷键以 <leader> 为前缀,形成统一的命名空间,避免与 Vim 内置快捷键冲突。

插件管理

配置使用 vim-plug 管理插件,首次启动会自动安装 vim-plug 本身。运行 :PlugInstall 即可安装所有插件。如需更新插件,使用 :PlugUpdate;清理未使用的插件使用 :PlugClean

持久化撤销

undofile 将撤销历史保存到磁盘,即使关闭文件后重新打开,仍然可以使用 u 撤销之前的修改。撤销文件存储在 ~/.vim/undodir 目录下。

常用技巧

  • 使用 :PlugInstall 安装所有插件,:PlugUpdate 更新,:PlugClean 清理
  • jk 快速退出插入模式,比 Esc 键更快且手指不用离开主键区
  • <Space>ff 模糊搜索文件,<Space>fg 全局内容搜索,是项目导航的核心操作
  • <Space>e 切换文件树,<Space>nf 在树中定位当前文件
  • gcc 注释/取消注释当前行(vim-commentary),可视模式下 gc 注释选中区域
  • cs"' 将双引号改为单引号(vim-surround),ds" 删除包围的双引号
  • <C-d><C-u> 半页滚动后自动居中,搜索跳转也保持居中
  • 通过 . 重复上一次编辑操作,结合 vim-repeat 可重复插件操作
  • :Git blame 查看每行代码的最后修改者,:Gdiffsplit 查看当前文件的 Git diff
  • 使用 gd 跳转到定义,gf 跳转到光标下的文件路径
  • 在可视模式下用 <> 调整缩进,配置已确保缩进后保持选中状态