[Vim] Vim高效配置导论Sun Nov 05 2017

Yijun's MacVim

此文为作者使用Vim近一年来的一些总结. 文章整体叙述一种方法和思路。

而不是误导大家,什么配置是最好的,什么插件是最好的, 什么按键是最全面的....

其实,适合自己的,就是最好的!

在学习Vim的过程中,令我感触最深的无非就是它强大的配置特性,在近一年的时间里,我已经无法适应其它IDE,甚至我完全不想使用鼠标。并且效率越来越高,无论是开发,重构,乃至是自己的开源项目。 全部都上Vim,入坑之后基本上就不太远切换其他的编辑器了

总结:

  • 学习别人的配置文件
  • 在尽量不重写原生键位的情况下,扩展按键方式
  • 编写工具函数, 使得很多繁琐的操作得以简化
  • 只需要你需要的,抛弃你不需要的



1.学习别人的配置文件

从完全不习惯,到慢慢适应, 熟悉了Vim的一些原生键位后,很多人对于写自己的配置没有头绪. 第一是不知道怎样开始,第二,对于VimL不太了解,这里我不推荐直接看VimL的基础.

这个时候需要先阅读基础的配置,从简单到深入 ,

这时候不妨先看看带注释的配置文件:

可能你一懒,就用上了 spf13 , exVim 这样的懒人配置文件,但是我可以负责任的告诉观众们,直接使用别人的配置文件是毫无成长的,或者说你理解不了Vim真正的魅力.

首先. 我们保证对于最基本的配置有了一定认识,比如你确定你明白了下面配置的意思. 例如:

" Ignore case when searching
set ignorecase

" When searching try to be smart about cases 
set smartcase

" Highlight search results
set hlsearch

之后我们开始寻找一些其它人的配置文件作为参考,从而认识到更加多的配置属性, 以及配置经验 , 或者直接看内置的help文档也行, 接下来让我们看看YouCompeleteMe 作者 Valloric 的配置文件:

Valloric/dotfiles

这个配置可以说朴实无华, 几乎是找不出什么特别的地方, 但是仔细看一下 449 行:

" our <leader> will be the space key
let mapleader=" "

" our <localleader> will be the '-' key
let maplocalleader="-"

发现作者将Leader键位映射到了空格,在编程中我们极少使用的大拇指一下变成了主力, 并且作为各种指令操作的关键按键. 令我感到无比惊讶 . 这正是寻找极致优化键位的一种体现, 让配置完全改变了手指的使用习惯!



2.在尽量不去改写原生键位的情况下,扩展键位

在Vim 中, HJKL 键位本身已经把自己需要做的事情care的很好的了,我们不需要再对这些键位进行重写, 但是有些按键就做的不够好。 例如:

g; , g+; 的键位可以让我们快速定位到之前每一步修改的位置 ( 使用 :help g; 查看文档)

但是这个组合按键做的不太好, 在跳转位置时候没有将窗口视角锁定到屏幕中央. 导致了我们会做一些不必要的翻页动作, 所以我们可以重写它:

" Format Jump
nnoremap <silent> g; g;zz
nnoremap <silent> g, g,zz

在执行完 g; 之后多添加一步 zz 操作 ( 使用 :help zz 查看文档), 将光标窗口自动滚动定位,使得光标垂直居中.

但是一般来说,我们仅仅只有在这个按键做的不够好的情况下,才使用重写的策略, 而多数键位是使用扩展的方式( 最大程度上保证向前兼容,遵循渐进增强的原则 ). 这样做的目的就在于,为了最大程度上保证配置可以跨平台使用

例如我们可以自定义分屏键位,不再需要每次都输入命令:

" Split fast
nnoremap <leader>\ :vs<CR>
nnoremap <leader>- :sp<CR>


3.编写工具函数+集成组合按键,完成常用操作

工具是用于解决特定的问题, 例如,如果你需要为Vim 制定一个样式主题, 那么首先你需要知道,文本中的解析 syntax className是什么 ,然后才可以知道,需要给哪个样式定义颜色, 我们定义一个 SynStack函数,用于检测当前光标下的单词,对应于那种syntax class,并输出在laststatus 中:

" Lookup HighLight Syntax Define
function! <SID>SynStack()
    echo map(synstack(line('.'),col('.')),'synIDattr(v:val, "name")')
endfunc

nnoremap <leader>yi :call <SID>SynStack()<CR>

这样一来,只要在光标所处的位置,按下 <leader>yi 就可以轻松或者当前位置的 syntax className

又例如,我们需要快速搜索一个选中的文本 ( 这里需要配合插件Ag ) :

" for search
function! VisualSelection(direction, extra_filter) range
    let l:saved_reg = @"
    execute "normal! vgvy"

    let l:pattern = escape(@", '\\/.*$^~[]')
    let l:pattern = substitute(l:pattern, "\nquot;, "", "")

    execute 'Ag '.l:pattern

    let @/ = l:pattern
    let @" = l:saved_reg
endfunction

vnoremap <leader>s :call VisualSelection('ag', '')<CR>

所以我们应该尽量做到,将一些常用的操作,通过函数+键位映射的方式快速解决. 看到这里你终于知道为什么Vim 可以比IDE 要快.



只需要你需要的,抛弃你不需要的

Vim 的哲学和 Unix 哲学是类似的:

简化你的配置文件的,只需要你需要的常用按键方式,一些多余少用的配置尽量删减,归类.

keep it simple, stupid

先让配置工作起来, 再进行深度优化:

Make it run, then make it right, then make it fast.


相关连接

YiJun's Dotfile

spf13 vimrc

amix/vimrc