Vim .vimrc 常用配置有哪些?怎么设置?
为什么你的 .vimrc 值得认真对待
很多人装完 Vim 就直接开干,全程默认配置硬扛。用了一阵子发现:中文乱码、缩进混乱、搜索结果看不清、反复敲着冗长的命令——这些都是没配置 .vimrc 的后果。.vimrc 是 Vim 的灵魂配置文件,几乎所有的使用体验都由它决定。花半小时配好它,之后每天都能省下大量重复操作的时间。
.vimrc 文件在哪
不同系统的位置略有区别:
- Linux / macOS:
~/.vimrc - Windows:
%USERPROFILE%/_vimrc - Neovim 用户:
~/.config/nvim/init.vim
如果文件不存在,直接创建即可。Vim 启动时会自动读取这个文件。
基础设置:让 Vim 不再难用
先把最基本的问题解决掉——编码、缩进、行号这些,不设置的话日常编辑会非常难受。
vim" 编码设置,解决中文乱码 set encoding=utf-8 set fileencoding=utf-8 set fileencodings=utf-8,gbk,gb2312,cp936,ucs-bom,latin1 set fileformats=unix,dos,mac " 缩进和 Tab set tabstop=4 " Tab 键显示宽度 set softtabstop=4 " 按下 Tab 键时插入的空格数 set shiftwidth=4 " 自动缩进宽度 set expandtab " 将 Tab 转为空格 set autoindent " 继承上一行缩进 set smartindent " 智能缩进(C 语言风格自动调整) set shiftround " 缩进取整到 shiftwidth 的倍数 " 行号和光标 set number " 显示绝对行号 set relativenumber " 显示相对行号(配合 number 使用更高效) set cursorline " 高亮当前行 set ruler " 右下角显示光标位置 " 兼容性 set nocompatible " 不兼容 vi,启用 Vim 增强特性
这里有个细节:number 和 relativenumber 同时开启时,当前行显示绝对行号,其余行显示相对行号。这对用 3j、5k 快速移动特别方便,因为你一眼就能看到距离。
搜索配置:找东西又快又准
默认的搜索功能比较原始,加上几个设置就顺手很多:
vimset ignorecase " 搜索忽略大小写 set smartcase " 如果搜索包含大写字母则区分大小写 set hlsearch " 高亮所有搜索结果 set incsearch " 输入时实时跳转匹配
ignorecase + smartcase 这对组合很实用:输入 foo 会匹配 Foo、FOO,但输入 Foo 就只匹配 Foo。既灵活又不会误匹配。
搜索结果高亮有时候很烦人,加一个快捷键随时清除:
vimnnoremap <Esc><Esc> :nohlsearch<CR>
连按两次 Esc 就取消高亮,不用再输入 :noh。
键映射:把重复操作变成一个按键
Vim 的键映射是提升效率的核心。这里给一些实际常用的映射:
vim" Leader 键设为空格(比默认的 \ 好按很多) let mapleader = " " " 快速保存和退出 nnoremap <leader>w :w<CR> nnoremap <leader>q :q<CR> nnoremap <leader>x :x<CR> " 窗口导航(不用按 Ctrl+W) 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>n :bnext<CR> nnoremap <leader>p :bprevious<CR> nnoremap <leader>d :bdelete<CR> " 行内快速移动 nnoremap H ^ nnoremap L $ " 选中全文 nnoremap <C-a> ggVG " 系统剪贴板复制粘贴 vnoremap <C-c> "+y nnoremap <C-v> "+p
关于 Leader 键,空格键是大多数人的选择,因为它是键盘上最大的键,左手拇指随时能碰到,而且它在 Normal 模式下没有任何默认功能。
有一点要注意:映射时尽量用 nnoremap 而不是 nmap。nnoremap 不递归展开,避免映射冲突导致的奇怪行为。这是 Vim 配置中最常见的坑之一。
自动命令:让 Vim 自动干活
自动命令(autocmd)可以在特定事件触发时自动执行操作,比如保存时自动去掉行尾空格、打开文件时跳到上次编辑的位置:
vim" 保存时自动去除行尾空格 autocmd BufWritePre * :%s/\s\+$//e " 打开文件时恢复上次光标位置 autocmd BufReadPost * \ if line("'"") >= 1 && line("'"") <= line("$") | \ exe "normal! g`"" | \ endif " 针对特定文件类型的缩进设置 autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab autocmd FileType javascript,json,html,css setlocal tabstop=2 shiftwidth=2 expandtab autocmd FileType go setlocal tabstop=4 shiftwidth=4 noexpandtab " 新建文件时自动插入模板 autocmd BufNewFile *.sh 0r ~/.vim/templates/shell.tpl
建议把自动命令放在 augroup 里,防止重复加载:
vimaugroup MyAutoCmds autocmd! autocmd BufWritePre * :%s/\s\+$//e augroup END
autocmd! 清除同组已有的自动命令,避免每次 source .vimrc 时重复注册。
插件配置入口:从手动管理到插件管理器
手动拷贝插件到 ~/.vim/plugin/ 的时代已经过去了。现在主流的插件管理器有 vim-plug 和 Vundle,推荐 vim-plug,因为更轻量且支持懒加载。
vim" 安装 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 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' " 状态栏 Plug 'vim-airline/vim-airline' " 语法检查 Plug 'dense-analysis/ale' " 自动补全 Plug 'neoclide/coc.nvim', {'branch': 'release'} " Git 集成 Plug 'tpope/vim-fugitive' call plug#end()
安装完插件后,在 Vim 里执行 :PlugInstall 就能一键安装所有声明的插件。
插件虽好,但别贪多。每加一个插件都要问自己:这个功能我真的需要吗?插件越多,启动越慢,出问题排查也越困难。
性能优化:让 Vim 飞起来
配置多了以后启动变慢是常有的事,几个设置可以缓解:
vim" 禁用交换文件和备份(用了 Git 就不太需要这些) set noswapfile set nobackup set nowritebackup " 撤销持久化,关闭文件后还能撤销 set undofile set undodir=~/.vim/undo " 延迟更新(减少重绘次数) set lazyredraw " 折叠设置 set foldmethod=marker " 使用 marker 折叠,比 syntax 快 set foldlevelstart=99 " 打开文件时不自动折叠 " 正则引擎(大文件时提速) set regexpengine=1 " 使用老引擎,某些情况下更快
如果启动速度已经让你难以忍受,可以测量一下:
vim" 启动时测量各脚本加载时间 " vim --startuptime ~/.vimstart.log " 然后查看 ~/.vimstart.log 找到慢的插件
用 vim --startuptime vim.log 打开 Vim,退出后检查 vim.log,能精确看到每个插件和脚本的加载耗时,谁慢一目了然。
一个可用的完整 .vimrc 模板
把上面的内容整合一下,这是一个开箱即用的配置:
vim" ========== 基础设置 ========== set nocompatible set encoding=utf-8 set fileencoding=utf-8 set fileencodings=utf-8,gbk,gb2312,cp936,ucs-bom,latin1 " ========== 编辑行为 ========== set tabstop=4 set softtabstop=4 set shiftwidth=4 set expandtab set autoindent set smartindent set shiftround " ========== 显示设置 ========== set number set relativenumber set cursorline set ruler set showcmd set wildmenu set laststatus=2 set scrolloff=5 set sidescrolloff=10 " ========== 搜索设置 ========== set ignorecase set smartcase set hlsearch set incsearch nnoremap <Esc><Esc> :nohlsearch<CR> " ========== 键映射 ========== let mapleader = " " nnoremap <leader>w :w<CR> nnoremap <leader>q :q<CR> 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>n :bnext<CR> nnoremap <leader>p :bprevious<CR> nnoremap H ^ nnoremap L $ " ========== 文件与性能 ========== set noswapfile set nobackup set nowritebackup set undofile set undodir=~/.vim/undo set lazyredraw set hidden set autoread " ========== 自动命令 ========== augroup MyAutoCmds autocmd! autocmd BufWritePre * :%s/\s\+$//e autocmd BufReadPost * \ if line("'"") >= 1 && line("'"") <= line("$") | \ exe "normal! g`"" | \ endif autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab autocmd FileType javascript,json,html,css setlocal tabstop=2 shiftwidth=2 expandtab augroup END " ========== 插件 ========== call plug#begin('~/.vim/plugged') Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' Plug 'vim-airline/vim-airline' Plug 'dense-analysis/ale' call plug#end() " ========== 语法和文件类型 ========== syntax on filetype plugin indent on
配置是迭代出来的
不要想着一次配好所有东西。最佳实践是:先用最简配置开始,遇到不顺手的地方再加设置。过一段时间回头看,你会发现 .vimrc 就是你的编辑习惯的缩影——每个配置项背后都是一次"这操作太烦了"的真实体验。定期清理不用的映射和插件,保持配置文件的精简,比堆砌功能更重要。