Vim 配置、技巧及其周边

常用配置函数

Vim 有一些配置函数,利用这些函数,我们可以通过修改配置文件让我们的 Vim 发挥出更强大的功能。

line(expr)

The result is a Number , which is the line number of the file position given with expr .
The accepted positions are: “.” the cursor position; “$” the last line in the current buffer; x position of mark “x” (if the mark is not set, 0 is returned).

返回值是一个整数。这个函数功能时返回一个行号。如果你后面的参数 expr 是 “.” 的话,则返回当前光标所在的位置。如果 expr 是 “$” 则返回当前缓冲区最后一行的行号。如果 expr 的值是一个标签名,则返回你对应的标签所在的行号。
例如:call line(“.”) 得到当前光标所在的行号。

col({expr})

返回指定位置的列号,列号从1开始算起。
例如:echo col(“.”) 返回光标所在的列号。echo col(“$”) 返回光标所在的行的长度+1。echo col([2,’$’]) 返回第2行的长度+1。(之所以是长度+1是因为,其实每行的最后有一个不可打印的换行符)

setpos({expr})

移动光标到指定的行和列。
例如:let pos=[0, 25, 15, 0]; call setpos(“.”, pos) 移动光标到 25 行 15 列的位置。

setline ({lnum}, {text})

Set line {lnum} of the current buffer to {text}.If this succeeds, 0 is returned. If this fails (most likely lnum is invalid) 1 is returned.
When {lnum} is just below the last line the {text} will be added as a new line.

这个函数就是将第 lnum 行的内容替换成 text 中的内容。如果这个 lunm 行是最后一行的下面一行,那么将新建一行,然后将 text 的内容存放到这一行。如果不是最后一行的下一行,则要满足的条件是行号为 lnum 的行必须是存在的。
例如:call setline(1, “/*********************/“) 在文件的开头添加上面的一行,主要是用于 .c/.cpp 文件注释的。

getline({lnum}, {end})

Without the {end},the result is a String, which is line {lnum} from the current buffer.
When {end} is given the result is a List where each item is a line from the current buffer in the range {lnum} to {end}, including line {end}.

返回值是一个字符串。当 end 参数存在的时候,函数返回行号为 lnum 的内容,否则函数将返回行 lnum 到行 end 的所有内容(包括第 end 行)。
例如:let lines=getline(2, 5); call append(6, lines) 取得 2-5 行的内容,然后从第六行的下一行开始添加,保持原来的格式不变。

append(lnum, string)

Append the text string after line lnum in the current buffer. lnum can be zero, to insert a line before the first one. Returns 1 for failure (lnum out of range) or 0 for success.

这个函数就是将 string 这个字符串,插入到行号为 lnum 的下一行。成功则返回 0,否则返回 1 。

expand(expr [, flag])

Expand the file wildcards in expr . The result is a String .
When the result of expr starts with% , # or < , the expansion is done like for the cmdline- special variables with their associated modifiers. There cannot be a white space between the variables and the following modifier. When the current or alternate file name is not defined, % or # use an empty string. Using %:p in a buffer with no name results in the current directory, with a “/ ”added.
When {expr} starts with ‘%’, ‘#’ or ‘<’, the expansion is done like for the |cmdline-special| variables with their associated modifiers. Here is a short overview:
“%” current file name;
“#“ alternate file name;
“#n” alternate file name n.
Modifiers:
:p expand to full path;
:h head (last path component removed);
:t tail (last path component only);
:r root (one extension removed);
:e extension only.

函数的返回值是一个字符串。功能就是将参数 expr 这个通配符进行扩展。各个通配符的含义上面列出来了。
例如:call append(2, “File Name: “.expand(“%”)) 在文件的第三行写入这句话 “File Name: ${filename}”,这边%表示当前文件的名称,通过函数expand(”%”)将其还原成了文件名字符串。let sourcefilepath=expand(“%:p”) 获取到当前文件的完全路径(绝对路径)。

配置函数应用举例

在用 Vim 打开文件后,在命令模式下,输入命令

1
:echo col(".")

即返回光标所在的列号。
在「$HOME/.vimrc」文件中添加如下语句

1
2
3
if has("autocmd")
au BufReadPost * if line("'.") > 0 && line("'.") <= line("$") | exe "normal! `." | endif
endif

此设置即在文件打开时,如果文件上次编辑的位置存在(即不在 1 行和最大行数以外),自动跳转至上次编辑的位置。
此外,可以使用

1
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! '\"" | endif

跳转至上次离开的行首。或使用

1
au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! `\"" | endif

跳转至上次离开的位置。


Vim 配置收录

以下:

配置 功能
set hlsearch 搜索时高亮反白匹配字符串
set autoindent 自动缩排
set ruler 底边显示状态栏
set showmode 左下角显示模式状态
set nu 行首显示行号
set bg=dark 设置底色色调
syntax on 开启语法检查
set nocompatible 不使用兼容模式
set textwidth=0 或 set tw=0 设置行宽,为 0 时即不自动换行
set backup 开启自动备份
set bdir=~/.vim 设置备份目录
set history=50 设置命令历史长度
set tabstop=4 或 set ts=4 设置制表符 tab 长度
set shiftwidth=2 或 set sw=2 设置自动缩进空格数
set showcmd 显示命令
set showmatch 显示匹配
set ignorecase 忽略大小写
set incsearch 输入搜索命令时显示当前匹配
set autowrite 执行外部命令时自动保存
set nolist 不显示不可见字符
set mouse=a 鼠标可用
set nowrap 不自动折行
set expandtab 采用空格代替制表符 tab 缩进
set cursorline 高亮当前行
set cursorcolumn 高亮当前列
set relativenumber 显示相对行号
set colorcolumn=80 设置高亮某列
highlight ColorColumn ctermfg=9 ctermbg=242 设置列高亮背景色
imap tt <esc> 用 tt 连续按键代替 ESC 键
set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936,gb2312 解决部分字符乱码问题

注:本表持续更新中

将以上配置写入「$HOME/.vimrc」文件,即可对所有文件打开生效。
如果想要对某些文件采用不同的打开初始配置,可在相应的文件末尾加入类似如下语句

1
# vim:ft=make:sw=4:wrap

该文件为一个 makefile 文件,第一个字符 “#” 为 makefile 文件的注释符,不同的文件可以采用各自相应的注释符。”ft=make” 即指文件格式为 makefile 文件,Vim 自动按 makefile 语法高亮文本,”sw=4” 即设置自动缩进空格数为 4,”wrap” 即设置自动折行,在这里,省去配置语句中的 set,不同的配置语句间用 “:” 隔开。


Vim 命令技巧收录

以下:

命令 作用
:se cuc 垂直竖杠(即 set cursorcolum)
:Sex 浏览目录
:helpgrep ColorColumn 查找与 ColorColumn 相关的帮助
:hi 查看 highlight 的系统配色方案

注:本表持续更新中


vim-plug 管理插件

vim-plug 是一款轻量的 Vim 插件管理器,通过如下一条命令即可完成安装:

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

之后再在 ~/.vimrc 文件中加入类似如下内容即可启用:

1
2
3
4
call plug#begin('~/.vim/plugged')
Plug 'SirVer/ultisnips'
Plug 'lervag/vimtex'
call plug#end()

上例中直接加载了 SirVer/ultisnipslervag/vimtex 插件,Plug 起始行可根据自己的需要加载不同的第三方插件。

保存上述修改之后,重新打开 Vim,在命令模式下执行 :PlugInstall 即可安装上述加载的插件,再次重启 Vim 正确加载插件后,根据自己的需要在 ~/.vimrc 中设置不同的环境变量以更改插件的默认设置。

若想卸载插件,先在 ~/.vimrc 中注释掉该插件所对应的 Plug 起始行,再重新打开 Vim,在命令模式下执行 :Plugclean 即可。

常用插件推荐配置

SirVer/ultisnips

SirVer/ultisnips 是一款代码片段模板自动补全插件。推荐配置如下:

1
2
3
4
let g:UltiSnipsExpandTrigger = '<tab>'
let g:UltiSnipsJumpForwardTrigger = '<tab>'
let g:UltiSnipsJumpBackwardTrigger = '<s-tab>'
let g:UltiSnipsEditSplit = 'vertical'

在 Vim 命令模式下执行 :h UltiSnips 即可查看该插件的帮助文档。

lervag/vimtex

lervag/vimtex 是一款对 LaTeX 文件(以 .tex 为文件名后缀)提供实时编译功能的插件。推荐配置如下:

1
2
3
4
5
6
let g:vimtex_compiler_method = 'latexmk'
let g:vimtex_compiler_latexmk = {'backend' : 'jobs'}
set conceallevel=1
let g:tex_conceal = 'abdmg'
let g:vimtex_indent_enabled = 0
let g:vimtex_quickfix_latexlog = {'default' : 0}

在 Vim 命令模式下执行 :h vimtex 即可查看该插件的帮助文档。

airblade/vim-gitgutter

airblade/vim-gitgutter 是一款在编辑文件时实时显示 git 差异(与 git diff 结果类似)的插件。推荐配置如下:

1
2
3
4
5
set updatetime=100
highlight GitGutterAdd ctermfg=2
highlight GitGutterChange ctermfg=3
highlight GitGutterDelete ctermfg=1
highlight GitGutterChangeDelete ctermfg=4

在 Vim 命令模式下执行 :h gitgutter 即可查看该插件的帮助文档。

jiangmiao/auto-pairs

jiangmiao/auto-pairs 是一款在插入左括号时自动补全右括号的插件。推荐配置如下:

1
2
let g:AutoPairsFlyMode = 1
let g:AutoPairsMapCR = 0

该插件的帮助文档见 README.md

ycm-core/YouCompleteMe

ycm-core/YouCompleteMe 是一款强大的基于语义分析的代码补全插件。先以命令 [user@A ~] sudo apt install build-essential cmake vim-nox python3-dev 安装依赖,再正常安装插件,最后在 Vim 命令模式下执行 :YcmRestartServer 启动语义分析补全服务,即可正常使用。推荐配置如下:

1
2
3
4
5
6
set completeopt=longest,menu
let g:ycm_min_num_of_chars_for_completion = 3
let g:ycm_seed_identifiers_with_syntax = 1
let g:ycm_complete_in_comments = 1
let g:ycm_complete_in_strings = 1
let g:ycm_collect_identifiers_from_comments_and_strings = 1

在 Vim 命令模式下执行 :h youcompleteme 即可查看该插件的帮助文档。

---------- 文结至此 静待下章 ----------