IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    每日vim插件--强大的自动补全neocomplete.vim和supertab

    foocoder (notice520@gmail.com)发表于 2016-01-14 11:12:38
    love 0

    #neocomplete.vim

    今天介绍两个个必备的vim插件,自动补全插件——neocomplete.vim和superTab。

    neocomplete.vim是来自shougo的作品。该插件维护了当前buffer的一个关键词列表,从而提供强大的关键词补全功能。

    该插件是他前作neocomplcache的升级版,速度更快,功能更强大。不过该插件需要if_lua的支持。

    mac下安装:

    brew install macvim --with-cscope --with-lua --HEAD
    

    或者不用macvim(真的不用么?赶紧试试吧):

    brew install vim --with-lua
    

    不需要过多的介绍,看作者给的图:

    文件补全

    Original filename completion.
    Include filename completion.

    Omni 补全

    Omni completion.

    vimshell补全

    Completion with vimshell(http://github.com/Shougo/vimshell).

    Vim 补全

    Vim completion.
    Vim completion with animation.

    作者还给出了推荐配置,每个配置都有对应的英文注释,我就不一一翻译了:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    "Note: This option must set it in .vimrc(_vimrc).  NOT IN .gvimrc(_gvimrc)!
    " Disable AutoComplPop.
    let g:acp_enableAtStartup = 0
    " Use neocomplete.
    let g:neocomplete#enable_at_startup = 1
    " Use smartcase.
    let g:neocomplete#enable_smart_case = 1
    " Set minimum syntax keyword length.
    let g:neocomplete#sources#syntax#min_keyword_length = 3
    let g:neocomplete#lock_buffer_name_pattern = '\*ku\*'

    " Define dictionary.
    let g:neocomplete#sources#dictionary#dictionaries = {
    \ 'default' : '',
    \ 'vimshell' : $HOME.'/.vimshell_hist',
    \ 'scheme' : $HOME.'/.gosh_completions'
    \ }

    " Define keyword.
    if !exists('g:neocomplete#keyword_patterns')
    let g:neocomplete#keyword_patterns = {}
    endif
    let g:neocomplete#keyword_patterns['default'] = '\h\w*'

    " Plugin key-mappings.
    inoremap <expr><C-g> neocomplete#undo_completion()
    inoremap <expr><C-l> neocomplete#complete_common_string()

    " Recommended key-mappings.
    " <CR>: close popup and save indent.
    inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
    function! s:my_cr_function()
    return neocomplete#close_popup() . "\<CR>"
    " For no inserting <CR> key.
    "return pumvisible() ? neocomplete#close_popup() : "\<CR>"
    endfunction
    " <TAB>: completion.
    inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
    " <C-h>, <BS>: close popup and delete backword char.
    inoremap <expr><C-h> neocomplete#smart_close_popup()."\<C-h>"
    inoremap <expr><BS> neocomplete#smart_close_popup()."\<C-h>"
    inoremap <expr><C-y> neocomplete#close_popup()
    inoremap <expr><C-e> neocomplete#cancel_popup()
    " Close popup by <Space>.
    "inoremap <expr><Space> pumvisible() ? neocomplete#close_popup() : "\<Space>"

    " For cursor moving in insert mode(Not recommended)
    "inoremap <expr><Left> neocomplete#close_popup() . "\<Left>"
    "inoremap <expr><Right> neocomplete#close_popup() . "\<Right>"
    "inoremap <expr><Up> neocomplete#close_popup() . "\<Up>"
    "inoremap <expr><Down> neocomplete#close_popup() . "\<Down>"
    " Or set this.
    "let g:neocomplete#enable_cursor_hold_i = 1
    " Or set this.
    "let g:neocomplete#enable_insert_char_pre = 1

    " AutoComplPop like behavior.
    "let g:neocomplete#enable_auto_select = 1

    " Shell like behavior(not recommended).
    "set completeopt+=longest
    "let g:neocomplete#enable_auto_select = 1
    "let g:neocomplete#disable_auto_complete = 1
    "inoremap <expr><TAB> pumvisible() ? "\<Down>" : "\<C-x>\<C-u>"

    " Enable omni completion.
    autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
    autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
    autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
    autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
    autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags

    " Enable heavy omni completion.
    if !exists('g:neocomplete#sources#omni#input_patterns')
    let g:neocomplete#sources#omni#input_patterns = {}
    endif
    "let g:neocomplete#sources#omni#input_patterns.php = '[^. \t]->\h\w*\|\h\w*::'
    "let g:neocomplete#sources#omni#input_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)'
    "let g:neocomplete#sources#omni#input_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::'

    " For perlomni.vim setting.
    " https://github.com/c9s/perlomni.vim
    let g:neocomplete#sources#omni#input_patterns.perl = '\h\w*->\h\w*\|\h\w*::'

    没有特殊需求,直接copy就用即可。没有复杂的配置,用起来还是非常简单的。

    还有一个比较出名的补全插件是YouCompleteMe.大家也可以去看下,应该是现在用的最广泛的补全插件了。我很早就试用过,还是neocomplete要更顺手更快些,总感觉neocomplete要更智能些。

    #superTab

    说到补全还有个不得不说,那就是tab键,必须用tab来进行补全那才是补全啊。其实neocomplete的推荐配置已经配置成了自动提示补全文字,并且支持tab选择,但是还是无法shift-tab回退选择。superTab就是为增强tab而生,当然可以做到这点。

    superTab 和neocomplete一样,几乎不用自己折腾什么配置,也不用过多的介绍,一句话就可以说完它的功能。

    bar
    baz
    b*<Tab> (*为光标所在位置) 
    

    按示例在光标处按下tab,就会展开推荐补全bar和baz,按tab即可进行循环选择。

    可以配置supertab的默认补全类型(对vim补全不了解的同学自己补下omni补全相关知识,需要我介绍可以回复下):

    let g:SuperTabDefaultCompletionType = "<c-x><c-u>"
    

    示例把supertab修改为了用户补全,默认是<c-p>.

    今天就介绍到这里。



沪ICP备19023445号-2号
友情链接