初始化过程

  • 正如多数 linux 软件,vim 的配置文件分为系统配置文件 /etc/vimrc,/usr/share/vim/ 和用户配置文件 ~/.vimrc,~/.vim/。
  • vim 的配置文件载入过程为:
  • /etc/vimrc
  • HOME/.vim/ HOME/.vimrc
  • VIMRUNTIME/.vim 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会在载入时寻找并加载 RUNTIMEPATH/ftplugin.vim 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 | `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

Vim Solarized 主题配色

  • 下面只是科普,没什么用,可以自己去在线配色网站上弄一份,直接放到最后就行了
  • 256个颜色到底有哪些呢?经过一番查找,我找到了如下图(出处网址http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html)
  • 任意文本编辑器打开~/.vim/colors/solarized.vim。跳转到第301行
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
Logo

更多推荐