ページ

2012年1月24日火曜日

AutoComplPopをほんの少しいじる

tabで補完するために以下を.vimrcに書く。

"<TAB>で補完
" {{{ Autocompletion using the TAB key
" This function determines, wether we are on the start of the line text (then tab indents) or
" if we want to try autocompletion
function! InsertTabWrapper()
        let col = col('.') - 1
        if !col || getline('.')[col - 1] !~ '\k'
                return "\<TAB>"
        else
                if pumvisible()
                        return "\<C-N>"
                else
                        return "\<C-N>\<C-P>"
                end
        endif
endfunction
" Remap the tab key to select action with InsertTabWrapper
inoremap <tab> <c-r>=InsertTabWrapper()<cr>
" }}} Autocompletion using the TAB key

でしばらく使ってたんだけどしっくり来ない。

補完の第一候補が最初から選択されているので、returnキーならそのまま確定するのだけどtabを押すと二個目が選択されちゃって戻ったりしなきゃいけない。

これはストレスなので.vim/bundle/AutoComplPop/autoload/acp.vimの中身を見て、
function acp#onPopupPost()
  " to clear <C-r>= expression on command-line
  echo ''
  if pumvisible()
    inoremap <silent> <expr> <C-h> acp#onBs()
    inoremap <silent> <expr> <BS>  acp#onBs()
    " a command to restore to original text and select the first match
    return (s:behavsCurrent[s:iBehavs].command =~# "\<C-p>" ? "\<C-n>\<Up>"  : "\<C-p>\<Down>")
の部分をこう書き換えた
function acp#onPopupPost()
  " to clear <C-r>= expression on command-line
  echo ''
  if pumvisible()
    inoremap <silent> <expr> <C-h> acp#onBs()
    inoremap <silent> <expr> <BS>  acp#onBs()
    inoremap <expr> <CR> pumvisible() ? "\<C-Y>\<CR>" : "\<CR>"
    " a command to restore to original text and select the first match
    return (s:behavsCurrent[s:iBehavs].command =~# "\<C-p>" ? "\<C-n>\<Up>\<C-n>"  : "\<C-p>\<Down>\<C-p>")
最後のところは<Up>と<Down>を消すだけでもいいけど、なんとなく消すのが嫌だったのでこうした。
これで、tabを押したタイミングで第一候補から選択、returnは補完があろうがなかろうが改行になった。

参考:
autocomplpop.vimでリアルタイムにキーワード補完 - ナレッジエース
autocomplpop.vim -自動補完プラグイン- « Labs@doya.in

0 件のコメント:

コメントを投稿