# 定制

通常 Vim 的配置文件会存储在你的家目录下:$HOME/.vimrc,不同的系统可能会有所不同。

更多信息可以通过 :h vimrc:h vimfiles 来查看(h 是 help 的缩写)。

# 配置项

在配置文件注释需要使用 ",配置完成后可以使用 :source ~/.vimrc 来使其立即生效。

使用 :set 可以查看已经配置的内容,:set all 则可以看到所有的配置。

功能 配置 备注
显示行号 set number number 可以缩写为 nu
与系统共享复制粘贴 set clipboard=unnamed
高亮搜索结果 set hlsearch
添加游标底线 set cursorline
取消 swap 暂存机制 set noswapfile
输入模式,使用空白替代 Tab,并指定个数 set softtabstop=2
Normal 模式,缩进的宽度为两个空格 set shiftwidth=2
将 Tab 替换为空白 set expandtab 需要结合 :retab 激活重新计算 Tab
总是显示 Tab 标签,默认只有一个标签时,顶部不会显示标签 set showtabline=2
水平切割窗格时,打开在下面 set splitbelow
垂直切割窗格时,打开在右边 set splitright
搜索匹配不区分大小写 set ignorecase
开启渐进式搜索 set incsearch
开启语法支持 syntax on
指定颜色主题 colorscheme <theme_name> :colorschme + Ctrl + d 查看可用列表
显示当前所在行和列 set ruler
关闭折行 set nowrap
折行时保持单词完整 set linebreak
关闭显示当前模式 set noshowmode
显示当前进行的指定 set showcmd
在临近边界三行的位置开始滚动 set scrolloff=3
输入的关键字中存在大写时,智能关闭忽略大小写 set smartcase
显示 Tab 和换行 set list

针对不同的文件类型,可以在换行等步骤进行智能的缩进等。

filetype on
filetype indent on
filetype plugin on

另外,使用 source <path_to_file> 可以启用指定的文件中的配置。这样可以把配置进行分解,分类放置在不同的文件中。

# Key Map

设置按键映射,可以根据不同的模式进行定制,对应的指令包括 mapnmapimapvmap

其中 map 可以在 Normal 和 Vistual 模式下同时生效。

使用 :h key-notation 可以查看特殊按键在 Vim 中的指代。

比如在 Vistual 模式使用 TabShift + Tab 来进行缩进。

vmap <Tab> >>
vmap <S-Tab> <<

如果你需要将某个按键设置为无行为的话,可以将其映射为 <Nop>

使用 :map 可以查看已经指定的映射。

另外,为了避免循环映射的出现,还可使用 noremap,同样对应不同的模式提供了 nmapimapvmap 指令。

如果你想取消某个映射的话,可以使用 unmap,同样每个模式有对应的指令。比如取消上面的缩进指令:

vumap <Tab>
vumap <S-Tab>

你也可以使用 :mapclear 直接一次性取消所有的映射。

# Auto CMD

类似发布订阅机制。指定在某种事件发生时,触发对应的指令。使用 :h autocmd 可以查看支持的事件。

比如,只在激活的窗格中显示 cursorline

autocmd WinEnter * setlocal cursorline
autocmd WinLeave * setlocal nocursorline

或则存档时自动清除多余的空格:

autocmd BufWritePre * :%s/\s\+$//e

或则在按下 F5 时执行当前文件:

autocmd BufRead,BufNewFile *.js noremap <F5> :% w !node <Enter>

# 配置语法

如果配置语法出现错误,可能会导致整个程序崩溃。因此在可能会出错的地方可以做一些安全措施。

比如将指令放置到 try catch 语句中,Vim 也提供了类似的机制。

try
    colorscheme darkblue
catch
    colorscheme shine
endtry

在配置 autocmd 时,可以先检查是否支持:

if executable("node")
    autocmd BufRead,BufNewFile *.js noremap <F5> :% w !node <Enter>
else
    autocmd BufRead,BufNewFile *.js noremap <F5> :echo "you need to install node first!"
endif

# 插件

为了对插件进行管理,所以通常会先安装一个插件管理器。

这里使用更加轻量的插件管理器 vim-plug (opens new window),它利用异步并行可以快速地安装、更新和卸载插件。

# 安装
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

启用则需要在配置文件中添加以下内容:

# Specify a directory for plugins
call plug#begin('~/.vim/plugged')
# plugins...
# Initialize plugin system
call plug#end()

当我们需要安装一个插件时,只需要知道插件在 GitHub 上的地址,然后在上面 plugins... 的地方进行指定。

比如安装 Vim Airline:

# 注意使用单引号
# 你也可以指定完整地址,或则像下面这也简写
Plug 'vim-airline/vim-airline'

然后重载 .vimrc 文件,执行 :PlugInstall 即可。

常用的命令包括:

:PlugUpgrade # 更新插件本身
:PlugUpdate # 更新所有已安装的插件
:PlugStatus # 查看已安装插件的状态
# 如果希望卸载插件,先在配置文件中注释或者删除对应插件的配置信息,然后再执行以下命令:
:PlugClean

# 其它

在 Vim 中可以使用 . 来重复上一次的动作,但是这好像并不好控制上一次的动作应该包括哪些。

好在 Vim 提供了类似于录制和重播的功能。当你在 Normal 模式按下 q 时,紧接着指定一个 register 就可以进行录制模式。

在按下 q 来结束录制之前,期间的动作都会被记录。之后,你可以通过按下 @ 紧接着指定一个 register 来重复这个 register 记录的动作。

使用 :reg <register> 可以查看 register 记录的动作。

全局替换也是一个比较常用的功能。

例如我想把 test1 都替换为 test2 可以使用 :%s/test1/test2/g 来完成。将其中的 g 指定为 gc 则会在每个替换前进行询问。