# Vim 配置管理

2024年8月08日11分钟阅读

- FormalSciences/ComputerScience
- GettingStarted/CommandLineTools
- Vim

## `vimrc` 文件

### 位置

`vimrc` 文件是 Vim 的配置文件，用于存储用户的个人设置和定制。它的位置可能因操作系统而异：

- Linux/Unix：通常在 `~/.vimrc` 或 `~/.vim/vimrc`
- MacOS：类似于 Linux，通常在 `~/.vimrc` 或 `~/.vim/vimrc`
- Windows：在 `C:\Users\<用户名>\_vimrc` 或 `C:\Users\<用户名>\vimfiles\vimrc`

在 Vim 中，可以通过以下命令查看 `vimrc` 文件的位置：

    :echo $MYVIMRC

### 基本结构

一个典型的 `vimrc` 文件可能包含以下几部分：

1. 全局设置：设置 Vim 的全局行为，例如编码、文件格式等。
2. 界面设置：配置界面元素，例如行号、颜色主题、状态栏等。
3. 编辑设置：调整编辑行为，例如自动缩进、搜索选项等。
4. 插件设置：加载和配置 Vim 插件。
5. 快捷键映射：自定义快捷键，提升编辑效率。

### 示例配置

    " 全局设置
    set nocompatible            " 关闭与 Vi 的兼容模式
    filetype off                " 关闭文件类型检测

    " 界面设置
    set number                  " 显示行号
    syntax on                   " 启用语法高亮
    set background=dark         " 设置背景色为暗色系
    colorscheme desert          " 使用 desert 颜色主题

    " 编辑设置
    set tabstop=4               " 设置 Tab 宽度为 4 个空格
    set shiftwidth=4            " 设置自动缩进的宽度为 4 个空格
    set expandtab               " 将 Tab 转换为空格
    set autoindent              " 自动缩进新行
    set hlsearch                " 高亮搜索结果
    set incsearch               " 增量搜索

    " 插件设置
    call plug#begin('~/.vim/plugged')
    Plug 'scrooloose/nerdtree'  " 文件树插件
    Plug 'tpope/vim-fugitive'   " Git 集成插件
    call plug#end()

    " 快捷键映射
    nnoremap <C-n> :NERDTreeToggle<CR>  " Ctrl+n 切换 NERDTree

### 常用配置选项

配置选项 | 说明 | 示例
--- | --- | ---
`set nocompatible` | 关闭与 Vi 的兼容模式 | `set nocompatible`
`set number` | 显示行号 | `set number`
`set relativenumber` | 显示相对行号 | `set relativenumber`
`set tabstop` | 设置 Tab 宽度（以空格数表示） | `set tabstop=4`
`set shiftwidth` | 设置自动缩进的宽度（以空格数表示） | `set shiftwidth=4`
`set expandtab` | 将 Tab 转换为空格 | `set expandtab`
`set autoindent` | 自动缩进新行 | `set autoindent`
`set smartindent` | 智能缩进 | `set smartindent`
`set hlsearch` | 高亮搜索结果 | `set hlsearch`
`set incsearch` | 增量搜索 | `set incsearch`
`set ignorecase` | 搜索时忽略大小写 | `set ignorecase`
`set smartcase` | 智能大小写匹配 | `set smartcase`
`syntax on` | 启用语法高亮 | `syntax on`
`set background` | 设置背景色（dark 或 light） | `set background=dark`
`colorscheme` | 设置颜色主题 | `colorscheme desert`
`set cursorline` | 高亮当前行 | `set cursorline`
`set wrap` | 自动换行显示长行 | `set wrap`
`set nowrap` | 禁止自动换行显示长行 | `set nowrap`
`set linebreak` | 在单词边界处换行 | `set linebreak`
`set showcmd` | 显示部分命令（在底部命令行显示） | `set showcmd`
`set ruler` | 显示光标位置（行号和列号） | `set ruler`
`set wildmenu` | 命令行补全增强 | `set wildmenu`
`set clipboard` | 使用系统剪贴板 | `set clipboard=unnamedplus`
`set backspace` | 设置退格键的行为 | `set backspace=indent,eol,start`
`set mouse` | 启用鼠标操作（a 为全部模式启用） | `set mouse=a`
`set splitbelow` | 新窗口在当前窗口下方打开 | `set splitbelow`
`set splitright` | 新窗口在当前窗口右侧打开 | `set splitright`
`set foldmethod` | 设置折叠方法（syntax、indent 等） | `set foldmethod=syntax`
`set foldlevel` | 设置折叠级别 | `set foldlevel=99`
`set termguicolors` | 启用真彩色支持（需要终端支持） | `set termguicolors`
`set guifont` | 设置 GUI 字体（在 GUI Vim 中使用） | `set guifont=Monaco:h12`
`set encoding` | 设置文件编码 | `set encoding=utf-8`
`filetype plugin indent on` | 启用文件类型检测和插件 | `filetype plugin indent on`
`set spell` | 启用拼写检查 | `set spell`
`set spelllang` | 设置拼写检查语言 | `set spelllang=en_us`
`set list` | 显示不可见字符 | `set list`
`set listchars` | 设置不可见字符的显示方式 | `set listchars=tab:>-,trail:~,eol:$`
`set undofile` | 启用撤销文件 | `set undofile`
`set undodir` | 设置撤销文件的保存路径 | `set undodir=~/.vim/undodir`
`set backup` | 启用备份文件 | `set backup`
`set backupdir` | 设置备份文件的保存路径 | `set backupdir=~/.vim/backup`
`set updatetime` | 设置交换文件的更新频率（毫秒） | `set updatetime=300`

## 快捷键映射

### 自定义快捷键

Vim 提供了强大的快捷键映射功能，用户可以根据需要自定义快捷键。常用的映射命令有：

- `map`：通用映射
- `nmap`：普通模式下的映射
- `imap`：插入模式下的映射
- `vmap`：可视模式下的映射

    nnoremap <C-s> :w<CR>       " 在普通模式下，Ctrl+s 保存文件
    inoremap <C-c> <Esc>        " 在插入模式下，Ctrl+c 切换到普通模式
    vnoremap <C-c> "+y          " 在可视模式下，Ctrl+c 复制到系统剪贴板

### 常用快捷键示例

以下是一些常用的快捷键示例，这些快捷键可以提高日常编辑的效率：

快捷键配置 | 模式 | 说明 | 示例
--- | --- | --- | ---
`nnoremap <C-s> :w<CR>` | 普通模式 | `Ctrl+s` 保存文件 | `nnoremap <C-s> :w<CR>`
`inoremap <C-c> <Esc>` | 插入模式 | `Ctrl+c` 退出插入模式 | `inoremap <C-c> <Esc>`
`vnoremap <C-c> "+y` | 可视模式 | `Ctrl+c` 复制到系统剪贴板 | `vnoremap <C-c> "+y`
`nnoremap <C-x> :q<CR>` | 普通模式 | `Ctrl+x` 退出 Vim | `nnoremap <C-x> :q<CR>`
`nnoremap <C-t> :tabnew<CR>` | 普通模式 | `Ctrl+t` 打开新标签 | `nnoremap <C-t> :tabnew<CR>`
`nnoremap <C-n> :NERDTreeToggle<CR>` | 普通模式 | `Ctrl+n` 切换 NERDTree 文件树 | `nnoremap <C-n> :NERDTreeToggle<CR>`
`nnoremap <Leader>f :Files<CR>` | 普通模式 | `Leader+f` 调用 FZF 查找文件 | `nnoremap <Leader>f :Files<CR>`
`nnoremap <Leader>g :Gstatus<CR>` | 普通模式 | `Leader+g` 调用 Git 状态 | `nnoremap <Leader>g :Gstatus<CR>`
`nnoremap <Leader>w :w!<CR>` | 普通模式 | `Leader+w` 强制保存文件 | `nnoremap <Leader>w :w!<CR>`
`nnoremap <Leader>q :q!<CR>` | 普通模式 | `Leader+q` 强制退出 Vim | `nnoremap <Leader>q :q!<CR>`
`nnoremap <Leader>r :source $MYVIMRC<CR>` | 普通模式 | `Leader+r` 重新加载 `vimrc` 文件 | `nnoremap <Leader>r :source $MYVIMRC<CR>`
`vnoremap <Leader>y "+y` | 可视模式 | `Leader+y` 复制选中文本到系统剪贴板 | `vnoremap <Leader>y "+y`
`nnoremap <Leader>p "+p` | 普通模式 | `Leader+p` 从系统剪贴板粘贴 | `nnoremap <Leader>p "+p`
`nnoremap <Leader>t :terminal<CR>` | 普通模式 | `Leader+t` 打开终端 | `nnoremap <Leader>t :terminal<CR>`
`nnoremap <C-j> :cnext<CR>` | 普通模式 | `Ctrl+j` 跳到下一个 QuickFix 项 | `nnoremap <C-j> :cnext<CR>`
`nnoremap <C-k> :cprev<CR>` | 普通模式 | `Ctrl+k` 跳到上一个 QuickFix 项 | `nnoremap <C-k> :cprev<CR>`
`nnoremap <Leader>n :nohlsearch<CR>` | 普通模式 | `Leader+n` 取消搜索高亮 | `nnoremap <Leader>n :nohlsearch<CR>`
`nnoremap <Leader>e :e ~/.vimrc<CR>` | 普通模式 | `Leader+e` 打开 `vimrc` 文件 | `nnoremap <Leader>e :e ~/.vimrc<CR>`
`nnoremap <Leader>d "_d` | 普通模式 | `Leader+d` 删除但不复制到寄存器 | `nnoremap <Leader>d "_d`

## Vim 插件管理

### 插件管理工具

#### Vundle

Vundle
是一个流行的 Vim 插件管理工具，安装步骤如下：

1. 克隆 Vundle 仓库到 Vim 的插件目录：

       $ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

2. 在 `vimrc` 文件中添加以下内容：

       set nocompatible              " 关闭 Vi 兼容模式
       filetype off                  " 关闭文件类型检测

       " 设置 Vundle
       set rtp+=~/.vim/bundle/Vundle.vim
       call vundle#begin()
       " 在此处添加插件
       Plugin 'VundleVim/Vundle.vim'
       call vundle#end()            " 所有插件必须在这一行之前

       filetype plugin indent on    " 启用文件类型检测

基本使用：

- 安装插件： 在 `vimrc` 中添加插件后，启动 Vim 并运行 `:PluginInstall`。
- 更新插件： 启动 Vim 并运行 `:PluginUpdate`。
- 删除插件： 从 `vimrc` 中移除插件行，启动 Vim 并运行 `:PluginClean`。

#### Vim-plug

vim-plug
是一个现代的 Vim 插件管理工具，安装步骤如下：

1. 下载 vim-plug 并放入 `autoload` 目录：

       $ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

2. 在 `vimrc` 文件中添加以下内容：

       call plug#begin('~/.vim/plugged')
       " 在此处添加插件
       Plug 'junegunn/vim-plug'
       call plug#end()

基本使用：

- 安装插件： 在 `vimrc` 中添加插件后，启动 Vim 并运行 `:PlugInstall`。
- 更新插件： 启动 Vim 并运行 `:PlugUpdate`。
- 删除插件： 从 `vimrc` 中移除插件行，启动 Vim 并运行 `:PlugClean`。

### 常用插件

插件 | 功能描述 | 安装配置示例（基于 vim-plug） | 常用命令或快捷键
--- | --- | --- | ---
NERDTree | 文件树管理 | `Plug 'preservim/nerdtree'` | `:NERDTreeToggle`
fzf.vim | 模糊查找 | `Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }` | `:Files` `:Buffers`
ctrlp.vim | 文件和缓冲区切换 | `Plug 'ctrlpvim/ctrlp.vim'` | `:CtrlP`
YouCompleteMe | 代码补全 | `Plug 'ycm-core/YouCompleteMe'` (需要编译安装) | 自动代码补全
Syntastic | 语法检查 | `Plug 'vim-syntastic/syntastic'` | `:SyntasticCheck`
vim-airline | 状态栏美化 | `Plug 'vim-airline/vim-airline'` `Plug 'vim-airline/vim-airline-themes'` | 自动启用状态栏美化
vim-fugitive | Git 集成 | `Plug 'tpope/vim-fugitive'` | `:Gstatus` `:Gcommit` `:Gpush` `:Gpull`
vim-surround | 快速修改括号、引号等符号 | `Plug 'tpope/vim-surround'` | `ysiw]` `ds'` `cs"'`
vim-commentary | 快速注释代码 | `Plug 'tpope/vim-commentary'` | `gc` + 动作
vim-gitgutter | 显示 Git 更改信息 | `Plug 'airblade/vim-gitgutter'` | 自动显示更改标记

### 配置示例

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

    " 文件树管理
    Plug 'preservim/nerdtree'

    " 模糊查找
    Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
    Plug 'junegunn/fzf.vim'

    " 文件和缓冲区切换
    Plug 'ctrlpvim/ctrlp.vim'

    " 状态栏美化
    Plug 'vim-airline/vim-airline'
    Plug 'vim-airline/vim-airline-themes'

    " Git 集成
    Plug 'tpope/vim-fugitive'

    " 快速修改括号、引号等符号
    Plug 'tpope/vim-surround'

    " 快速注释代码
    Plug 'tpope/vim-commentary'

    " 显示 Git 更改信息
    Plug 'airblade/vim-gitgutter'

    call plug#end()

    " 基本设置
    set nocompatible
    set number
    set relativenumber
    set tabstop=4
    set shiftwidth=4
    set expandtab
    set autoindent
    set hlsearch
    set incsearch
    set ignorecase
    set smartcase
    syntax on
    set background=dark
    colorscheme desert
    set cursorline
    set wrap
    set showcmd
    set ruler
    set wildmenu
    set clipboard=unnamedplus
    set backspace=indent,eol,start
    set mouse=a
    set splitbelow
    set splitright
    set foldmethod=syntax
    set foldlevel=99
    set termguicolors

    " 快捷键映射
    nnoremap <C-n> :NERDTreeToggle<CR>
    nnoremap <C-p> :CtrlP<CR>
    nnoremap <Leader>f :Files<CR>
    nnoremap <Leader>g :Gstatus<CR>
    nnoremap <Leader>w :w!<CR>
    nnoremap <Leader>q :q!<CR>
    nnoremap <Leader>r :source $MYVIMRC<CR>
    vnoremap <Leader>y "+y
    nnoremap <Leader>p "+p
    nnoremap <Leader>t :terminal<CR>
    nnoremap <C-j> :cnext<CR>
    nnoremap <C-k> :cprev<CR>
    nnoremap <Leader>n :nohlsearch<CR>
    nnoremap <Leader>e :e ~/.vimrc<CR>
    nnoremap <Leader>d "_d

    " Airline 主题
    let g:airline_theme='luna'

    " GitGutter 配置
    let g:gitgutter_enabled = 1