初始化过程
正如多数 linux 软件,vim 的配置文件分为系统配置文件 /etc/vimrc,/usr/share/vim/ 和用户配置文件 ~/.vimrc,~/.vim/。 vim 的配置文件载入过程为: /etc/vimrc
H O M E / . v i m / ,
HOME/.vimrc
V I M R U N T I M E / . v i m ,
VIMRUNTIME/.vimrc$HOME/.vim/after/ 通过运行 $ vim -V 可查看整个初始化过程。
文件类型识别与对应插件加载
Vim可针对特定的文件,加载指定插件。以此来实现文件类型的特殊配置以及语法高亮。 参见:http://vimcdoc.sourceforge.net/doc/filetype.html#filetype-plugins filetype on 将开启文件识别,Vim 会在载入时做如下工作: 执行$RUNTIMEPATH/filetype.vim,根据文件名判断类型 如果需要的话,执行 $RUNTIMEPATH/scripts.vim,进一步判断文件类型 设置 Vim 的 filetype 变量 我们也可以通过诸如 :set filetype=c 的命令来手动设置文件类型 如果不使用文件识别,我们可以运行 au BufNewFile,BufRead .plt source ~/.vim/after/ftplugin/plt.vim 来使用 plt.vim 初始化 .plt 文件。 更多关于RUNTIMEPATH :http://vimcdoc.sourceforge.net/doc/options.html# ’runtimepath’ filetype plugin on 允许Vim加载文件类型的插件,Vim会在载入时寻找并加载
R U N T I M E P A T H / f t p l u g i n . v i m , 该 脚 本 会 寻 找 并 加 载
RUNTIMEPATH/ftplugin/.vim。 例如:~/.vim/ftplugin/cpp.vim 将在 cpp 文件类型被识别后自动载入。 同样,~/.vim/after/ftplugin/cpp.vim 会在最后被调用,进而覆盖之前的配置。 另外,filetype indent on 允许Vim加载该文件类型的缩进设置。即执行RUNTIMEPATH/indent.vim。
语法高亮
syntax on 允许 Vim 加载文件类型的语法高亮配置,Vim会在载入时寻找并加载 RUNTIMEPATH/syntax/.vim。 例如:~/.vim/syntax/markdown.vim 将会对文件类型markdown 进行语法高亮。
键盘映射
Vim支持定义键盘映射来完成快捷键的功能,也就是将特定的按键映射为一系列按键与函数的序列。 例如将 F7 映射为编译当前java文件: map :!javac %< : 为进入Ex模式,! 指定下面的命令在vim外执行,% 为当前文件名,%< 为不带扩展名的当前文件名, 为回车。 map 命令有多种工作模式,如下表。
map 模式 描述
n 普通
v 可视和选择
s 选择
x 可视
o 操作符等待
! 插入和命令行
i 插入
l 插入、命令行和 Lang-Arg 模式的 “:lmap” 映射
c 命令行
其中,map模式可作为map命令的前缀以指定其工作模式:
命令 左边 右边 模式
:map {lhs} {rhs} mapmode-nvo
:nm[ap] {lhs} {rhs} mapmode-n
:vm[ap] {lhs} {rhs} mapmode-v
:xm[ap] {lhs} {rhs} mapmode-x
:smap {lhs} {rhs} mapmode-s
:om[ap] {lhs} {rhs} mapmode-o
:map! {lhs} {rhs} mapmode-ic
:im[ap] {lhs} {rhs} mapmode-i
:lm[ap] {lhs} {rhs} mapmode-l
:cm[ap] {lhs} {rhs} mapmode-c
另外,可添加nore指定非递归方式(取消传递性)。如inoremap为插入模式下工作的map,并且没有递归。
函数
现在我们可以自定义快捷键了,如果希望在键盘映射中执行更复杂的功能,我们需要定义Vim函数。 函数名必须以大写字母开始 函数可以有返回值:return something 函数可以有范围前缀。定义:function s:Save(),调用:call s:Save() 下面是函数调用的例子,按键F8时,进入拷贝模式(取消行号,鼠标进入visual模式)。
" key mapping
map <F8> <Esc>:call ToggleCopy()<CR>
" global variable
let g:copymode=0
" function
function ToggleCopy()
if g:copymode
set number
set mouse=a
else
set nonumber
set mouse=v
endif
let g:copymode=!g:copymode
endfunction
录制宏
用户录制的宏保存在寄存器中,我们先来看看什么是寄存器。vim的寄存器分为数字寄存器和字母寄存器。 数字寄存器为0-9,0保存着上次复制的内容,1-9按照最近的顺序保存着最近删除的内容。 字母寄存器为a-z,拷贝3行到寄存器c:c3yy. 现在开始录制宏。假如有如下的文件,我们希望将第二列的类型用`分隔起来。
1 | BOOL | Boolean
2 | SINT | Short integer
3 | INT | Integer
4 | DINT | Double integer
5 | LINT | Long integer
6 | USINT | Unsigned short integer
7 | UINT | Unsigned integer
首先按几次进入normal模式,光标移到第一行,开始录制并存入m寄存器qm。 光标到行首^,到第二列词首ww,进入插入模式i,插入分隔符,退出到normal模式<Esc>,到词尾e,进入插入模式i,插入分隔符
,退出到normal模式,光标到下一行j。 结束录制q。 光标到第二行,在normal模式执行100次寄存器m中的宏100@m。 宏会在j执行错误后自动结束,得到如下文件:
1 | `B OOL` | Boolean
2 | `S INT` | Short integer
3 | `I NT` | Integer
4 | `D INT` | Double integer
5 | `L INT` | Long integer
6 | `U SINT` | Unsigned short integer
7 | `U INT` | Unsigned integer
Vim Solarized 主题配色
elseif g:solarized_termcolors == 256
let s:vmode = "cterm"
let s:base03 = "234"
let s:base02 = "235"
let s:base01 = "239"
let s:base00 = "240"
let s:base0 = "244"
let s:base1 = "245"
let s:base2 = "187"
let s:base3 = "230"
let s:yellow = "136"
let s:orange = "166"
let s:red = "124"
let s:magenta = "125"
let s:violet = "61"
let s:blue = "33"
let s:cyan = "37"
let s:green = "64"
由于本人主要是写C代码,经过了反复的测试实践,我总结的配色项目和C代码的对应关系如下(其中部分没有测出来):
项目名 影响内容
base03 不详
base02 :set list :set cursorline :set cursorcolum显示的背景
base01 普通注释颜色
base00 :set charlist标记的颜色
base0 函数名,标示符等普通字体颜色
base1 vim命令补全时,弹出选择栏的背景色
base2 vim命令补全时,弹出选择栏,当前选中项的背景色
base3 不详
yellow int char struct 等变量关键字的颜色
orange #开头的宏定义关键字的颜色
red dxoygen 注释标记的颜色
magenta 不详
violet 不详
blue 不详
cyan 字符串,include中的文件名的颜色
green 关键字颜色,例如for while return if 等