跳到主要内容

配置 Vim

Vim 的强大之处在于其高度可定制性。通过配置文件,你可以将 Vim 打造成完全符合个人习惯的编辑器。

配置文件

配置文件位置

系统配置文件路径
Linux/macOS~/.vimrc
Windows$HOME\_vimrc$VIM\_vimrc

检查配置文件位置

在 Vim 中执行:

:echo $MYVIMRC

重新加载配置

修改配置后,无需重启 Vim:

:source $MYVIMRC      " 重新加载配置
:so ~/.vimrc " 同上

基础配置

必备基础设置

" 基础设置
set nocompatible " 禁用 Vi 兼容模式,启用 Vim 特性
set encoding=utf-8 " 使用 UTF-8 编码
set fileencoding=utf-8 " 文件使用 UTF-8 编码
set fileencodings=utf-8,gbk " 自动检测文件编码

" 显示设置
set number " 显示行号
set relativenumber " 显示相对行号
set cursorline " 高亮当前行
set colorcolumn=80 " 在第 80 列显示参考线
set laststatus=2 " 始终显示状态栏
set showcmd " 显示正在输入的命令
set showmode " 显示当前模式
set showmatch " 显示匹配的括号

" 搜索设置
set hlsearch " 高亮搜索结果
set incsearch " 增量搜索
set ignorecase " 搜索时忽略大小写
set smartcase " 智能大小写(有大写字母时区分大小写)
set wrapscan " 循环搜索

" 编辑设置
set expandtab " 使用空格代替制表符
set tabstop=4 " 制表符显示为 4 个空格
set shiftwidth=4 " 自动缩进使用 4 个空格
set softtabstop=4 " 按退格键时删除 4 个空格
set autoindent " 自动缩进
set smartindent " 智能缩进
set cindent " C 语言风格缩进

" 换行设置
set wrap " 自动换行
set linebreak " 在单词边界换行
set textwidth=80 " 自动换行宽度

" 备份设置
set backup " 启用备份
set backupdir=~/.vim/backup " 备份文件目录
set directory=~/.vim/swap " 交换文件目录
set undodir=~/.vim/undo " 撤销文件目录
set undofile " 持久化撤销历史

" 其他设置
set clipboard=unnamedplus " 使用系统剪贴板
set mouse=a " 启用鼠标支持
set wildmenu " 命令行补全增强
set wildmode=list:longest " 补全模式
set hidden " 允许隐藏未保存的缓冲区
set autoread " 文件被外部修改时自动重载
set autowrite " 切换缓冲区时自动保存

" 启用语法高亮和文件类型检测
syntax on
filetype plugin indent on

键位映射

映射命令

命令模式说明
nmap普通模式普通模式映射
imap插入模式插入模式映射
vmap可视模式可视模式映射
cmap命令行模式命令行模式映射
omap操作符等待模式操作符映射
map普通+可视多模式映射

非递归映射(推荐):

命令说明
nnoremap普通模式非递归映射
inoremap插入模式非递归映射
vnoremap可视模式非递归映射
为什么使用非递归映射?

非递归映射不会触发其他映射,避免循环和意外行为。始终使用 noremap 版本。

实用键位映射

" 设置 leader 键
let mapleader = " " " 使用空格作为 leader 键
let maplocalleader = "\\" " 本地 leader 键

" 快速保存和退出
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
nnoremap <leader>x :x<CR>
nnoremap <leader>Q :q!<CR>

" 快速切换缓冲区
nnoremap <leader>bn :bnext<CR>
nnoremap <leader>bp :bprevious<CR>
nnoremap <leader>bd :bdelete<CR>

" 快速分屏
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>h :nohlsearch<CR>

" 快速移动到行首/行尾
nnoremap H ^
nnoremap L $
nnoremap J 5j
nnoremap K 5k

" 可视模式下缩进后保持选中
vnoremap < <gv
vnoremap > >gv

" 复制到系统剪贴板
vnoremap <leader>y "+y
nnoremap <leader>y "+y
nnoremap <leader>Y "+Y

" 从系统剪贴板粘贴
nnoremap <leader>p "+p
nnoremap <leader>P "+P

" 快速编辑 vimrc
nnoremap <leader>ev :vsplit $MYVIMRC<CR>
nnoremap <leader>sv :source $MYVIMRC<CR>

" 插入模式下快速退出
inoremap jk <Esc>
inoremap kj <Esc>

" 命令行模式增强
cnoremap <C-a> <Home>
cnoremap <C-e> <End>
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>

自动命令

自动命令(Autocmd)在特定事件发生时自动执行。

常用自动命令

" 打开文件时自动定位到上次编辑位置
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif

" 自动删除行尾空格
autocmd BufWritePre * %s/\s\+$//e

" 特定文件类型的设置
autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab
autocmd FileType javascript setlocal tabstop=2 shiftwidth=2 expandtab
autocmd FileType html,css setlocal tabstop=2 shiftwidth=2 expandtab

" 自动创建备份目录
autocmd VimEnter * if !isdirectory(expand("~/.vim/backup")) | call mkdir(expand("~/.vim/backup"), "p") | endif
autocmd VimEnter * if !isdirectory(expand("~/.vim/swap")) | call mkdir(expand("~/.vim/swap"), "p") | endif
autocmd VimEnter * if !isdirectory(expand("~/.vim/undo")) | call mkdir(expand("~/.vim/undo"), "p") | endif

" 高亮当前行(仅当前窗口)
autocmd WinEnter * setlocal cursorline
autocmd WinLeave * setlocal nocursorline

函数定义

" 切换相对行号和普通行号
function! ToggleRelativeNumber()
if &relativenumber
set norelativenumber
else
set relativenumber
endif
endfunction
nnoremap <leader>rn :call ToggleRelativeNumber()<CR>

" 删除当前文件的交换文件
function! DeleteSwap()
let swapfile = expand('%:p:h') . '/.' . expand('%:t') . '.swp'
if filereadable(swapfile)
call delete(swapfile)
echo "Deleted swap file: " . swapfile
else
echo "No swap file found"
endif
endfunction
command! DeleteSwap call DeleteSwap()

" 全选
function! SelectAll()
normal! ggVG
endfunction
nnoremap <C-a> :call SelectAll()<CR>

配色方案

设置配色方案

" 启用真彩色支持(需要终端支持)
set termguicolors

" 设置配色方案
colorscheme desert " 内置方案
colorscheme molokai " 需要安装
colorscheme gruvbox " 需要安装

自定义高亮

" 自定义高亮组
highlight CursorLine cterm=NONE ctermbg=darkgray ctermfg=white guibg=darkgray guifg=white
highlight ColorColumn ctermbg=darkgray guibg=darkgray
highlight Search cterm=bold ctermbg=yellow ctermfg=black guibg=yellow guifg=black

完整配置示例

" ============================================
" Vim 配置文件
" ============================================

" 基础设置
set nocompatible
set encoding=utf-8
set fileencoding=utf-8

" 显示设置
set number
set relativenumber
set cursorline
set colorcolumn=80,120
set laststatus=2
set showcmd
set showmode
set showmatch
set ruler

" 搜索设置
set hlsearch
set incsearch
set ignorecase
set smartcase
set wrapscan
nnoremap <leader>h :nohlsearch<CR>

" 编辑设置
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set autoindent
set smartindent

" 换行设置
set wrap
set linebreak
set textwidth=80

" 备份设置
set backup
set backupdir=~/.vim/backup
set directory=~/.vim/swap
set undodir=~/.vim/undo
set undofile

" 其他设置
set clipboard=unnamedplus
set mouse=a
set wildmenu
set wildmode=list:longest
set hidden
set autoread

" 启用语法高亮
syntax on
filetype plugin indent on

" Leader 键
let mapleader = " "

" 快速保存和退出
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
nnoremap <leader>x :x<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 H ^
nnoremap L $
nnoremap J 5j
nnoremap K 5k

" 可视模式缩进保持选中
vnoremap < <gv
vnoremap > >gv

" 编辑和重载 vimrc
nnoremap <leader>ev :vsplit $MYVIMRC<CR>
nnoremap <leader>sv :source $MYVIMRC<CR>

" 插入模式退出
inoremap jk <Esc>

" 自动命令
autocmd BufWritePre * %s/\s\+$//e
autocmd FileType python setlocal tabstop=4 shiftwidth=4
autocmd FileType javascript,html,css setlocal tabstop=2 shiftwidth=2

" 配色方案
set termguicolors
try
colorscheme desert
catch
colorscheme default
endtry

配置技巧

1. 条件配置

" 根据 Vim 版本启用功能
if has('vim9script')
" Vim 9 特有配置
endif

" 根据系统设置不同配置
if has('win32') || has('win64')
" Windows 配置
set shell=powershell
else
" Unix/Linux/macOS 配置
set shell=/bin/bash
endif

" 检查功能是否可用
if has('clipboard')
set clipboard=unnamedplus
endif

2. 插件管理器准备

" 为插件管理器创建目录结构
if empty(glob('~/.vim/autoload/plug.vim'))
" 提示安装插件管理器
echo "请安装 vim-plug"
endif

3. 性能优化

" 提高大文件性能
set lazyredraw " 执行宏时不重绘
set ttyfast " 快速终端连接
set updatetime=300 " 更新间隔

" 限制语法高亮的行数
set synmaxcol=200 " 每行最多高亮 200 列
set maxmempattern=5000 " 模式匹配内存限制

练习

练习 1:创建基础配置

1. 创建 ~/.vimrc 文件
2. 添加基础设置(行号、缩进、搜索等)
3. 添加几个键位映射
4. 保存并重启 Vim
5. 测试配置是否生效

练习 2:自定义键位

1. 设置 leader 键为空格
2. 添加 <leader>w 保存映射
3. 添加 jk 退出插入模式映射
4. 添加窗口导航映射
5. 测试这些映射

练习 3:自动命令

1. 添加自动删除行尾空格的自动命令
2. 添加回到上次编辑位置的自动命令
3. 为 Python 文件设置特定的缩进
4. 测试这些自动命令

下一步

掌握了 Vim 配置后,下一章我们将学习插件管理,通过安装插件来扩展 Vim 的功能。