个人的一些 vim 插件和配置推荐

By | 2015-05-19

目录

用 vim 也有一段时间了, 真心是越用越好用, 现已作为敲代码主力以及默认文本编辑器

于是来共享下自己的 vim 配置, 文章底部免费赠送个人在用的 gVim 绿色版以及配置,
也可以到 github 查看

此外, 可以参见 这篇文章 来一键进行配置

以下配置在 Windows gVim, Ubuntu vim, Mac vim, Mac MacVim, Android VimTouch 测试过 :)

插件

废话不多说, 先推荐下个人在用的插件: (排名按照字母顺序)

个人自己写的一些插件在此: http://zsaber.com/blog/p/70,
很多都是现有插件的强化替代, 本文就不列了

通用

  • junegunn/vim-plug

    管理插件的插件, 下文所有插件都可以用 Plug '插件名字' 进行安装

    之前一直用 Vundle, 后来换这货, 因为足够简单, 而且装插件的速度快

  • vim-scripts/xterm16.vim

    个人唯一在用的 vim 主题, 可以在各种终端下的显示都比较正常 (因为一些特殊原因, 本人偶尔会在 8 位色终端下跑 vim)

    不想纠结各种奇怪的显示问题的话, 强力推荐这个主题作为备用

    相对的, 256 色主题个人推荐使用 tomasr/molokaimorhetz/gruvbox, 美观, 看着也不累

  • cohama/agit.vim

    简单好用的 git 历史查看

  • DataWraith/auto_mkdir

    vim 一个文件名时, 自动创建中间的目录结构

  • jiangmiao/auto-pairs

    输入括号引号什么的时候自动补全配对

    同类插件挺多, 不过这个感觉用着效果最好, 不过偶尔会出现奇怪的 BUG, 所以建议还是把这货的退格和回车的映射禁用掉

  • vim-scripts/BufOnly.vim

    关闭除当前 buffer 外所有 buffer, 简单好用

  • ap/vim-buftabline

    显示 buffer 列表, 之前一直用 minibufexpl, 但这货用 tabline 来实现, 果然效果好了很多,
    唯一遗憾的是, 这货的配置项太少了

  • vim-scripts/CmdlineComplete

    命令模式下可以按 <c-p> 之类的按键来自动补全, 补全的内容可以是当前 buffer 中的内容, 偶尔还挺实用的, 不过也仅限于偶尔

  • junegunn/vim-easy-align

    按照指定字符进行列对齐, 非常适合拿来做一些排版操作
    (不过这货的命令规则太他喵的难记了, 需要一段时间适应)

  • dkprice/vim-easygrep

    作为一个从来记不住 grep 命令的人, 这个拿来做全工程替换还是挺不错的

    默认使用的是 vim 的 magic 模式的正则表达式, 可以开启 perl 风格的正则,
    具体参照 这里

  • Lokaltog/vim-easymotion

    这个真心太好用了, 再也不用数格子进行跳转了, 光标可以随心所欲的跳来跳去了, 强力推荐

    个人把这货映射到 s 上

    map s (easymotion-s)
    map S (easymotion-sol-bd-jk)

    此外, 想要支持中文的话, 可以参考 ZSaberLv0/vim-easymotion-chs

  • othree/eregex.vim

    搜索和替换的时候使用 perl 风格的正则表达式, 强力推荐替换掉 vim 自带的正则

  • terryma/vim-expand-region

    一键快速选中括号引号之类的东西包含的区域

    不过这玩意儿可能存在卡以及需要按多次的问题, 但是目前好像没发现靠谱的替代品

  • drmikehenry/vim-fontsize

    快速调整 gVim 的字体大小, 并且不依赖系统字体 (很多其他同类插件需要明确指定字体)

  • haya14busa/incsearch-fuzzy.vim

    模糊匹配的 incsearch, 需要 haya14busa/incsearch.vim

  • Yggdroot/LeaderF

    模糊匹配打开文件, 而且可以通过路径过滤, 相当好用

    不过这货需要 Python, 如果没有的, 建议 kien/ctrlp.vim 作为备胎, 毕竟快速打开文件还是必备功能

  • AndrewRadev/linediff.vim

    通过选择快速 diff 同一个 buffer 内的内容, 有时候挺好用的

  • andymass/vim-matchup

    用 vim 自带的 % 键, 在各种标记语言的 tag 之间快速跳转

    这货相比历史悠久的 adelarsq/vim-matchit, 好处是可以高亮, 坏处是跳转行为略微有点奇怪, 以及文件复杂了可能会卡

  • scrooloose/nerdtree

    众所周知的树形文件浏览器

    • jistr/vim-nerdtree-tabs

      nerdtree 的插件, 让所有 tab 共用同一个 nerdtree 侧边栏

    • ZSaberLv0/nerdtree_menu_util

      个人整理的 nerdtree 的插件, 给 nerdtree 添加一些好用的菜单项

  • google/vim-searchindex

    简单好用的显示搜索匹配个数的玩意儿

  • vim-scripts/ShowTrailingWhitespace

    行尾空格会以高亮显示出来, 保持优良代码风格必备

  • kshenoy/vim-signature

    可视化的 mark, 简单好用

  • ervandew/supertab

    按 tab 来进行自动完成, 并且可以根据当前场景使用不同自动完成模式, 再也不用纠结到底用 <c-p> 还是 <c-n> 什么的了

  • tpope/vim-surround

    快速添加删除和修改外层标签, 比如括号, html tag, 还可以添加自定义标签, 非常好用

  • SirVer/ultisnips

    快速插入一些预定义模板, 需要较长时间折腾属于自己的配置

    如果需要支持 python2, 这有个我的备份 ZSaberLv0/ultisnips_py2

    个人在用的模板 ZSaberLv0/ZF_ultisnips

  • KabbAmine/vZoom.vim

    简单好用的窗口最大化工具

  • ianva/vim-youdao-translater

    翻译插件, 老实讲, 一个能打的都没有, 就这个凑合能用一下

  • yuratomo/w3m.vim

    虽然看起来没卵用, 但是说不定哪天需要 ssh 到 VPS 科学上网呢 233

编程语言相关

好用但难配置的补全引擎先列在前面:

  • neoclide/coc.nvim

    node 的话别折腾别的了, 还是用这个吧

  • ncm2/ncm2 or Shougo/deoplete.nvim

    这俩在我来看都差不多, 好处是只要 python, 坏处是性能相对较差

  • Valloric/YouCompleteMe

    大名鼎鼎的语义补全插件, 不过已经有 neoclide/coc.nvim 这样的更好的替代品了

    • ZSaberLv0/ycm_conf_default : 好用的默认配置

其它通用插件列表:

  • taxilian/a.vim

    输入 :A 在 h/cpp 文件间切换

  • tyru/caw.vim

    快速注释/反注释一些内容, 这货应该算是支持文件类型最多的了

  • CompleteParameter.vim

    好用的函数参数补全, 需要配合一些 complete engine, 比如 neoclide/coc.nvim

  • sheerun/vim-polyglot

    大而全的文件类型收集, 不过广的代价大约就是不精吧

  • vim-syntastic/syntastic

    知名的语法检查插件, 好处是几乎不用怎么配置, 系统有相关 tools 就自动生效

语言相关插件:

  • Rip-Rip/clang_complete

    很好用的补全插件, 安装比各种补全插件容易多了, 不过问题也多,
    容易崩溃, 没有异步补全, 不支持模糊匹配, 备胎

  • rhysd/vim-gfm-syntax

    markdown 语法高亮等功能, 同类插件很多, 但是这个总体来说比较综合一点, 而且也支持代码块高亮

  • mzlogin/vim-markdown-toc

    插入并自动更新目录, 简单好用

  • amiorin/vim-fenced-code-blocks

    用于快速的编辑某一小段的代码块, 适合 markdown 这种内嵌其它语言代码块的

  • mhinz/vim-lookup

    没有补全引擎的情况下, 查找 vim 的函数, 有时候挺好用的

  • sukima/xmledit

    自动匹配 xml 标签

按键映射

扯完了插件, 当然要扯一下 vim 的各种按键映射

  • leader

    let mapleader="'"

    这个也纯粹个人喜好, 用单引号来做 leader, 因为个人偶尔在手机上用 vim, 单引号比较方便输入

  • esc

    inoremap  l
    inoremap jk l
    cnoremap jk 
    if has('terminal') || has('nvim')
        tnoremap jk 
        tnoremap  
    endif
    nnoremap  
    xnoremap  
    onoremap  

    之前一直用 jj 来当 esc, 虽然被很多大神诅咒为祸害新人的按键映射, 不过真的还是挺好用的

    后来经过别人推荐, 改成用 jk 了, 用起来更顺手

    个人在 <esc> 后加了个 l, 在大多数场景下更符合惯性思维吧, 具体体会一下就知道了

    顺便还映射了命令模式下用 jk 退出, 看到 <c-c> 而不是 <esc> 的时候有没有感觉脑子一抽? :D

  • visual 模式

    nnoremap V 
    vnoremap V 
    nnoremap  V
    vnoremap  V

    交换行选择和列选择模式, 因为感觉列选择模式明显用的次数更多

  • select 模式的一些映射

    let s:_selectmode_keys='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~!@#$%^&*-_=+\\|;:,./?)]}>'
    for i in range(strlen(s:_selectmode_keys))
        silent! execute 'snoremap  ' . s:_selectmode_keys[i] . ' "_c' . s:_selectmode_keys[i]
    endfor
    silent! snoremap   
    silent! snoremap  jk gv
    silent! snoremap   "_c
    silent! snoremap  ( "_c()i
    silent! snoremap  [ "_c[]i
    silent! snoremap  { "_c{}i
    silent! snoremap  < "_c<>i
    silent! snoremap  ' "_c''i
    silent! snoremap  " "_c""i
    silent! snoremap   <c-g>"_c`i

    在 select 模式下可以直接输入任意键来输入并替换原来的内容, 目前主要发现在 clang_complete 中非常好用

  • 光标移动

    nnoremap  zh
    nnoremap  zl
    nnoremap  
    nnoremap  

    滚屏幕, 毕竟 ctrl + hljk 比较顺手

    inoremap  
    inoremap  
    inoremap  
    inoremap  

    编辑模式下快速的移动光标, 这个倒是觉得挺必要的, 比直接按方向键或切换模式什么的方便多了

    cnoremap  
    cnoremap  
    cnoremap  
    cnoremap  

    命令模式下移动光标

    nnoremap H :bp
    nnoremap L :bn

    快速切换 buffer, 配合 minibufexpl 很好用

    nnoremap J 
    xnoremap J 
    nnoremap K 
    xnoremap K 

    翻页, 这个就纯粹个人喜好了, 偶尔在手机上用 vim, 这样比较好按

  • 光标跳转

    nmap z, %
    xmap z, %
    omap z, %
    
    nnoremap , $
    xnoremap , $
    onoremap , $
    nnoremap g, g$
    xnoremap g, g$
    onoremap g, g$

    个人喜好, 因为在手机上一些符号真心不好打

    nnoremap j gj
    xnoremap j gj
    onoremap j gj
    nnoremap gj j
    xnoremap gj j
    onoremap gj j
    
    nnoremap k gk
    xnoremap k gk
    onoremap k gk
    nnoremap gk k
    xnoremap gk k
    onoremap gk k

    在自动换行模式下, jk 可以按照习惯的方式上下移动, 这个当时我还找了挺久

  • 括号跳转

    nnoremap zg 
    
    nnoremap zg) va)h%
    nnoremap z) va)h
    xnoremap zg) <mz>va)h%m>`zm<:delmarks zgv
    xnoremap z) <mz>va)`zm<:delmarks zgvh
    
    nnoremap zg] va]h%
    nnoremap z] va]h
    xnoremap zg] <mz>va]h%m>`zm<:delmarks zgv
    xnoremap z] <mz>va]`zm<:delmarks zgvh
    
    nnoremap zg} va}h%
    nnoremap z} va}h
    xnoremap zg} <mz>va}h%m>`zm<:delmarks zgv
    xnoremap z} <mz>va}`zm<:delmarks zgvh
    
    nnoremap zg> va>h%
    nnoremap z> va>h
    xnoremap zg> <mz>va>h%m>`zm<:delmarks zgv
    xnoremap z> <mz>va>`zm<:delmarks zgvh
    
    nnoremap zg" vi"`
    xnoremap zg" <mz>vi"<m>zm<:delmarks zgv
    xnoremap z" <mz>vi"`zm<:delmarks zgv
    
    nnoremap zg' vi'`
    xnoremap zg' <mz>vi'<m>zm<:delmarks zgv
    xnoremap z' <mz>vi'`zm<:delmarks zgv
    
    nmap zg; zg}
    nmap z; z}
    xmap zg; zg}
    xmap z; z}

    在括号内时, 跳转到对应的括号上, 具体自行试试就知道了

  • tag 跳转

    nnoremap zj 
    nnoremap zk 
    nnoremap zh :tprevious
    nnoremap zl :tnext

    讲真, 撸多了会觉得 ctrl 键很不好用, 而且很多 ctrl 相关的快捷键没啥规律, 记不住

  • 撤销

    nnoremap U 

    个人喜好, 毕竟要把 u 和 <c-r> 联想到一起还是有点困难的, 而且这样更好按

  • 删除替换时, 不要覆盖剪贴板

    nnoremap c "_c
    xnoremap c "_c
    nnoremap d "_d
    xnoremap d "_d
    nnoremap  "_dl
    vnoremap  "_d
    inoremap  

    删除, visual 模式粘贴时, 不要替换剪贴板内容, 这个我也赌五毛很多人想要却不知道怎么实现

  • 各种粘贴

    if has('clipboard')
        nnoremap zp :let @" = @*:echo 'copied from system clipboard'
    else
        nnoremap zp 
    endif
    set clipboard+=unnamed
    set clipboard+=unnamedplus
    nnoremap p gP
    xnoremap p "_dgP
    nnoremap P gp
    xnoremap P "_dgp
    nmap  p
    xmap  p
    if has('clipboard')
        inoremap  *
        " paste as user typed
        " to ensure the command would exist in command history
        function! ZF_Setting_command_paste()
            call feedkeys("\*", 't')
            return ''
        endfunction
        cnoremap   '' . ZF_Setting_command_paste()
        snoremap  "_c*
    else
        inoremap  "
        cnoremap  "
        snoremap  "_dgP
    endif

    具体含义请自行 :h register, 感觉这样明显更符合常规的使用习惯

  • 窗口移动和大小

    nnoremap B :bufdo
    nnoremap zs :w
    nnoremap ZS :wa
    nnoremap zx :w:bd
    nnoremap ZX :wa:bufdo bd
    nnoremap cx :bd!
    nnoremap CX :bufdo bd!
    nnoremap x :bd
    command! W w !sudo tee % > /dev/null
    
    nnoremap WH h
    nnoremap WL l
    nnoremap WJ j
    nnoremap WK k
    
    nnoremap WO :resize:vertical resize
    nnoremap WI :vertical resize
    nnoremap WU :resize
    nnoremap WW w
    nnoremap WN =
    nnoremap Wh 30<
    nnoremap Wl 30>
    nnoremap Wj 10+
    nnoremap Wk 10-

    具体不解释了, 用了许久后总结出来的映射

  • 折叠模式

    xnoremap ZH zf
    nnoremap ZH zc
    nnoremap ZL zo
    nnoremap Zh zC
    nnoremap Zl zO
    nnoremap ZU zE
    nnoremap ZI zM
    nnoremap ZO zR

    hjkl 这么顺手的按键怎么可以不多用用

  • 比较模式

    nnoremap D 
    nnoremap DJ ]czz
    nnoremap DK [czz
    nnoremap DH do
    xnoremap DH :diffget
    nnoremap DL dp
    xnoremap DL :diffput
    nnoremap DD :diffupdate

    hjkl 这么顺手的按键怎么可以不多用用 +1

  • 快速左右缩进和上下移动一行

    nnoremap C 
    
    nnoremap CH v"txhh"tp
    nnoremap CL v"tx"tp
    nnoremap CJ mT:m+`T:delmarks T:echo ''
    nnoremap CK mT:m-2`T:delmarks T:echo ''
    
    xnoremap CH "txhh"tp<hm<>hm>gv
    xnoremap CL "tx"tp<lm<>lm>gv
    xnoremap CJ :m'>+gv
    xnoremap CK :m'<-2gv
    
    nnoremap < <<
    nnoremap > >>
  • 增减数字

    nnoremap CI 
    nnoremap CU 
    set nrformats+=alpha

    非常不喜欢用 ctrl 的快捷键, 于是又整了个大写字母的

  • 宏相关

    function! ZF_Setting_VimMacroMap()
        nnoremap Q :call ZF_Setting_VimMacroBegin(0)
        nnoremap zQ :call ZF_Setting_VimMacroBegin(1)
        nnoremap cQ :let @t='let @m="' . @m . '"'q:"tgP
        nmap M @m
    endfunction
    function! ZF_Setting_VimMacroBegin(isAppend)
        nnoremap Q q:call ZF_Setting_VimMacroEnd()
        nnoremap M q:call ZF_Setting_VimMacroEnd()@m
        if a:isAppend!=1
            normal! qm
        else
            normal! qM
        endif
    endfunction
    function! ZF_Setting_VimMacroEnd()
        call ZF_Setting_VimMacroMap()
        echo 'macro recorded, use M in normal mode to repeat'
    endfunction
    augroup ZF_Setting_VimMacro_augroup
        autocmd!
        autocmd User ZFVimrcPostNormal
                    \  call ZF_Setting_VimMacroMap()
                    \| nnoremap :: q:k$
                    \| nnoremap // q/k$
    augroup END

    按一个键明显比按两下更快嘛

  • 快速编辑命令行的命令

    function! ZF_Setting_cmdEdit()
        let cmdtype = getcmdtype()
        if cmdtype != ':' && cmdtype != '/'
            return ''
        endif
        call feedkeys("\q" . cmdtype . 'k0' . (getcmdpos() - 1) . 'li', 'nt')
        return ''
    endfunction
    cnoremap  ;; ZF_Setting_cmdEdit()

    简单粗暴又好用

  • 搜索相关

    nnoremap / /\v
    nnoremap ? /\v
    nnoremap vr :.,$s/\v/gec
    xnoremap vr "ty:.,$s/\vt//gec
    nnoremap zr :.,$s/\v/gec<>/
    xnoremap zr "ty:.,$s/\v<t>//gec
    
    nnoremap v/ :%s/\v//gn
    xnoremap v/ "ty:%s/\vt//gn
    nnoremap z/ :%s/\v<t>//gn
    xnoremap z/ "ty:%s/\v<t>//gn

    自行体会一下就知道这么映射的好用之处了

    如果有装 othree/eregex.vim 的话, 对应命令替换一下, 比如 :S

  • ctrl+z

    nnoremap  

    现在应该不会有人去用默认的 suspend 功能吧..?

小工具

一些简单但很实用的功能, 我都扔到单独一个插件去折腾了, 参见 ZSaberLv0/ZFVimUtil

这里列一些非常实用的东西:

  • ZF_ExecShell: 执行 shell 命令并复制执行结果到剪贴板

    这个如果 shell 命令熟悉的话可以搞出非常多玩法, 比如 find 找出文件之后贴到 vim buffer 中编辑, 快速生成一大堆 shell 命令

  • ZF_OpenAllFileInClipboard: 打开剪贴板中所有文件

    配合 ZF_ExecShell 很好用, 比如 find 之后直接用 vim 打开所有找到的文件

  • ZF_RunShellScriptInClipboard: 执行剪贴板中的 shell 命令

    配合 ZF_ExecShell, 然后用 vim 编辑 shell 命令, 再快速执行, 非常方便实用, 而且不容易出错

  • ZF_ExecCmd: 执行 vim 命令并复制执行结果到剪贴板

  • ZF_Calc: 计算器

  • ZF_NumberConvert: 进制转换

  • ZF_DiffBuffer: 快速比较两个 buffer

  • ZF_FoldBlock: 用正则来做代码块折叠

  • ZF_FoldBrace: 折叠各种括号内的内容

其它设置项

然后是一些 vim 默认设置的修改

  • 常规

    set hidden
    set list
    set listchars=tab:>\ ,trail:-,extends:>,precedes:<,nbsp:+
    set modeline
    silent! set shortmess+=F
    set showcmd
    set showmatch
    set wildmenu
    set autoread
    set nobackup
    set nowritebackup
    set noswapfile
    set nowrap
    set synmaxcol=200
    set lazyredraw
    set guioptions=gtk
    set whichwrap=b,s,<,>,[,]
    set display=lastline
    set sessionoptions-=options
    function! ZF_Setting_common_action()
        set number
        set textwidth=0
        set iskeyword=@,48-57,_,128-167,224-235
    endfunction
    call ZF_Setting_common_action()
    augroup ZF_Setting_common_augroup
        autocmd!
        autocmd FileType,BufNewFile,BufReadPost * call ZF_Setting_common_action()
    augroup END

    一般都会设置的, 但是没设的时候想找还很麻烦, 建议都 :help 一下

  • 大文件的自动适配

    function! ZF_Setting_isLargeFile(file)
        let size = getfsize(a:file)
        let largeFile = get(g:, 'ZF_Setting_largefile', 2 * 1024 * 1024)
        if size == -2 || (largeFile > 0 && size > largeFile)
            return 1
        endif
        let largeColumn = get(g:, 'ZF_Setting_largefile_column', 2000)
        if largeColumn > 0 && filereadable(a:file)
            for line in readfile(a:file, '', get(g:, 'ZF_Setting_largefile_columnChecklines', 20))
                if len(line) >= largeColumn
                    return 1
                endif
            endfor
        endif
        return 0
    endfunction
    augroup ZF_Setting_largefile_augroup
        autocmd!
        function! s:ZF_Setting_largefile_restore(...)
            set eventignore-=FileType
        endfunction
        function! s:ZF_Setting_largefile_setup(notifyRestore)
            if ZF_Setting_isLargeFile(expand(''))
                set eventignore+=FileType
                if has('timers')
                    call timer_start(1, function('s:ZF_Setting_largefile_restore'))
                endif
                setlocal bufhidden=unload
                setlocal foldmethod=manual
                setlocal nofoldenable
                setlocal nocursorline
                setlocal norelativenumber
                let b:zf_vim_largefile = 1
                doautocmd User ZFVimLargeFile
            else
                if get(b:, 'zf_vim_largefile', 0) && a:notifyRestore
                    let b:zf_vim_largefile = 0
                    doautocmd User ZFVimLargeFile
                endif
            endif
        endfunction
        autocmd User ZFVimLargeFile silent
        autocmd BufReadPre * call s:ZF_Setting_largefile_setup(0)
        autocmd BufWritePost * call s:ZF_Setting_largefile_setup(1)
    augroup END
  • 编码

    set fileformats=unix,dos
    set fileformat=unix
    set encoding=utf-8
    set fileencoding=utf-8
    set fileencodings=utf-8,ucs-bom,chinese

    因为基本都在用 UTF8, 所以也挺少遇到编码问题, 不知道是否有更好的配置方法

  • 搜索相关

    set ignorecase
    set smartcase
    set hlsearch
    set incsearch
    let s:ZF_Setting_ToggleSearch_last = ''
    function! ZF_Setting_ToggleSearch()
        if s:ZF_Setting_ToggleSearch_last == '' || s:ZF_Setting_ToggleSearch_last == @/
            let s:ZF_Setting_ToggleSearch_last = @/
            echo '' . s:ZF_Setting_ToggleSearch_last
            return
        endif
    
        echo 'choose search pattern:'
        echo '  j: ' . s:ZF_Setting_ToggleSearch_last
        echo '  k: ' . @/
        let confirm = nr2char(getchar())
        redraw!
    
        if confirm == 'j'
            let @/ = s:ZF_Setting_ToggleSearch_last
            silent! normal! n
            echo '' . @/
        elseif confirm == 'k'
            let s:ZF_Setting_ToggleSearch_last = @/
            silent! normal! n
            echo '' . @/
        else
            echo 'canceled'
        endif
    endfunction
    nnoremap zb :call ZF_Setting_ToggleSearch()
    
    nnoremap zn viwb/N
    xnoremap zn "ty/tN
    nnoremap zm viwb/\<\>N
    xnoremap zm "ty/\<t\>N
    
    nnoremap z/n viwb:%s///gn``
    xnoremap z/n "ty:%s/t//gn``
    nnoremap z/m viwb:%s/\<\>//gn``
    xnoremap z/m "ty:%s/\<t\>//gn``

    需要提一下的是 incsearch 感觉挺实用的, 不过不少平台都因为性能而默认关闭

    另外, 星号搜索是全字匹配, 其实大多时候不要全字匹配会更方便, 所以特意又折腾了 zn 和 zm 的按键映射

  • tab 和对齐相关

    set expandtab
    set shiftwidth=4
    set softtabstop=0
    set tabstop=4
    set smartindent
    set cindent
    set autoindent
    set cinkeys=0{,0},0),:,!^F,o,O,e

    cinkeys 是个好玩的东西, 有兴趣可以 :h 一下

  • 编辑相关

    set virtualedit=onemore,block
    set selection=exclusive
    set guicursor=a:block-blinkon0
    set backspace=indent,eol,start
    set scrolloff=5
    set sidescrolloff=5
    set selectmode=key
    set mouse=

    比较关键的是 virtualeditselection

    另外, 把 mouse 关掉, ssh 终端里用才更方便复制屏幕内容

  • 禁用斜体字

    if v:version > 704 && get(g:, 'ZF_Setting_disableItalic', 1)
        function! ZF_Setting_disableItalic()
            let his = ''
            try
                redir => his
                silent highlight
            finally
                redir END
            endtry
            let his = substitute(his, '\n\s\+', ' ', 'g')
            for line in split(his, "\n")
                if line !~ ' links to ' && line !~ ' cleared$'
                    execute 'hi' substitute(substitute(line, ' xxx ', ' ', ''), 'italic', 'none', 'g')
                endif
            endfor
        endfunction
        function! ZF_Setting_disableItalic_auto()
            if g:zf_low_performance
                augroup ZF_Setting_disableItalic_auto_augroup
                    autocmd!
                augroup END
            else
                silent! call ZF_Setting_disableItalic()
                augroup ZF_Setting_disableItalic_auto_augroup
                    autocmd!
                    autocmd FileType,BufNewFile,BufReadPost * silent! call ZF_Setting_disableItalic()
                augroup END
            endif
        endfunction
        call ZF_Setting_disableItalic_auto()
        augroup ZF_Setting_disableItalic_augroup
            autocmd!
            autocmd User ZFVimLowPerf call ZF_Setting_disableItalic_auto()
        augroup END
    endif

    vim 的斜体字一般都很难看啊…

  • 状态栏

    set laststatus=2
    let &statusline='%<%f %m%r%=%k %l/%L : %c   %y [%{(&bomb?",BOM ":"")}%{(&fenc=="")?&enc:&fenc} %{(&fileformat)}] %4b %04B %3p%%'
    augroup ZF_Setting_quickfix_statusline_augroup
        autocmd!
        autocmd BufWinEnter quickfix,qf
                    \ let &l:statusline='%<%t %=%k %l/%L : %c %4b %04B %3p%%'
    augroup END

    vim 状态栏的显示, 其实这样就足够了, 没太大必要专门去安装插件

  • 补全相关

    inoremap   pumvisible() ? "\" : "\u\"
    inoremap   pumvisible() ? '' : '=pumvisible() ? "\Up>" : ""'
    inoremap   pumvisible() ? '' : '=pumvisible() ? "\Down>" : ""'
    inoremap   pumvisible() ? '' : ''
    inoremap   pumvisible() ? '' : ''
    set completeopt=menuone,longest
    set complete=.,w,b,u,k,t
    set omnifunc=syntaxcomplete#Complete

    需要注意的是 complete 的设置会影响补全性能

  • 折叠相关

    function! ZF_Setting_fold_action()
        set foldminlines=0
        set foldlevel=128
        set foldmethod=manual
        normal! zE
    endfunction
    call ZF_Setting_fold_action()
    augroup ZF_Setting_fold_augroup
        autocmd!
        autocmd FileType,BufNewFile,BufReadPost * call ZF_Setting_fold_action()
    augroup END

    个人更喜欢手动折叠

  • 比较模式

    set diffopt=filler,context:200
  • q 键

    nnoremap q 
    xnoremap q 
    onoremap q 
    augroup ZF_setting_cmdwin
        autocmd!
        autocmd CmdwinEnter *
                    \ nnoremap   q :q
    augroup END
    augroup ZF_Setting_qToEsc_augroup
        autocmd!
        autocmd CmdwinEnter *
                    \ nnoremap   q :q
        autocmd BufWinEnter quickfix,qf
                    \  nnoremap   q :bd
                    \| nnoremap   vt :bd
                    \| nnoremap    :lclose
                    \| nnoremap   o :lclose
                    \| setlocal foldmethod=indent
        autocmd FileType help
                    \ nnoremap   q :q
    augroup END

    vim 的宏是个好用的东西, 不过说实话使用频率远不如其它一些基本按键, 所以交换一下 Q 和 q 用起来更爽

    尤其很多插件都把 q 作为退出按键, 统一一下习惯总是好的

平台相关设置

Windows

  • 启动最大化

    autocmd GUIEnter * simalt ~x

    一般情况下我还是喜欢启动时居中 (参见 这里),
    不过有些情况下并不靠谱, 对不齐, 所以最大化还得留着

  • shell

    if exists('&completeslash')
        set completeslash=slash
    endif
    let $PATH = 'C:\cygwin\bin;C:\cygwin64\bin;' . $PATH

    Windows 下还是要安装个 cygwin 比较好, 这样才有 grep 等各种好用的东西

    但是建议不要设 cygwin 为默认 shell, 使用 cmd.exe 能兼容大多数情况 (因为大多数插件有对 Windows 做兼容处理, 此时用 cygwin 反而会出问题)

    把 cygwin 的路径设置到 PATH 最前面, 可以防止一些命令和 Windows 自带的冲突, 比如 find

    shellslash 则见仁见智了, 在 Windows 下偶尔会造成一些插件出问题, 好在新版本加了个 completeslash

Cygwin

本配置也可以完美的在 cygwin 下使用, 不过需要注意两个参数, 建议放在 .vimrc 顶部

set shell=bash
set shellcmdflag=-c

DroidVim

Android 平台有相当好用的 DroidVim 了, 本文配置也可用于 DroidVim, 不过配置起来会麻烦一点

纯 VimL 的插件基本都可正常使用, 需要外部命令的则可能无法正常使用

安装

首先当然得装 DroidVim 本体了

装完后可以先打开玩玩, 改一下 DroidVim 本身的设置

配置

DroidVim 的配置在这个目录:

/data/data/com.droidvim/files/home/.vimrc

然而这货里面肯定是跑不了 git 了, 所以建议在电脑上更新好配置, 然后复制到上述路径

需要复制的内容, 以及最后的目录结构:

/data/data/com.droidvim/files/home/
    .vim/
        bundle/
            ...
    .vimrc
    zf_vimrc.vim

下载

共享一下本人在用的绿色版 vim (Windows 版本), 以及相应的 vimrc: 点我下载

或者, 也可以到 github 查看最新的配置 (时不时更新)

  • 网盘里的版本可能较旧, 建议运行一下 :call ZF_VimrcUpdate(), 可以自动更新所有内容和插件
  • 网盘里的绿色版已经配好大部分东西, 建议再装个 cygwin + python + node 即可
  • *nix 版本可以超快速的一键安装啦: curl zsaber.com/vim | sh, 具体参见 这里

over

转载请注明来自: http://zsaber.com/blog/p/31

既然都来了, 有啥想法顺便留个言呗? (无奈小广告太多, 需审核, 见谅)

4 thoughts on “个人的一些 vim 插件和配置推荐

    1. Z Post author

      别的平台装好, 然后把 .vim .vimrc zf_vimrc.vim 复制到 /data/data/net.momodalo.app.vimtouch/files/ 目录下

      Reply

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注