27

vimのオムニコンプリーション(およびオムニコンプリーションがない場合はキーワードコンプリーション)にCtrl+を使用したい。Space私はウェブ上のどこかで見つけたこれを試しました:

inoremap <expr> <c-space> pumvisible() ? "\<C-n>" : "\<C-x>\<C-o>\<C-n>\<C-p>\<C-r>=pumvisible() ? \"\\<Down>\" : \"\\<CR>\""

しかし、それは機能していません。Ctrlこれにも+を使用している人でSpace、正しい方法(機能する方法)を教えてくれる人はいますか?

注目に値するのは、gvimではなくvimのターミナルバージョンで動作する必要があるということです。

4

3 に答える 3

43

これを試して:

inoremap <expr> <C-Space> pumvisible() \|\| &omnifunc == '' ?
\ "\<lt>C-n>" :
\ "\<lt>C-x>\<lt>C-o><c-r>=pumvisible() ?" .
\ "\"\\<lt>c-n>\\<lt>c-p>\\<lt>c-n>\" :" .
\ "\" \\<lt>bs>\\<lt>C-n>\"\<CR>"
imap <C-@> <C-Space>
于 2009-02-04T08:54:04.387 に答える
18

上記の方法は「ある程度」機能していますが、非常に読みにくいため、実際に何をするかを言う人はほとんどいません。上記の解決策は良くありません。

簡単な回答 - これを使用します。

function! Auto_complete_string()
    if pumvisible()
        return "\<C-n>"
    else
        return "\<C-x>\<C-o>\<C-r>=Auto_complete_opened()\<CR>"
    end
endfunction

function! Auto_complete_opened()
    if pumvisible()
        return "\<Down>"
    end
    return ""
endfunction

inoremap <expr> <Nul> Auto_complete_string()
inoremap <expr> <C-Space> Auto_complete_string()

この回答は、Ctrl+Space:<C-Space><Nul>.

私はjedi-vimの最初のものと同様のアプローチを使用しますが、よりカスタマイズ可能です。


長い答え - 上記の機能:

上記の回答のエスケープ全体が非常に紛らわしいため、上記の回答を読み取り可能な形式に分割しました。

function! Auto_complete_string()                               
    if pumvisible()                                            
        return "\<C-n>"                                        
    else                                                       
        return "\<C-x>\<C-o>\<C-r>=Auto_complete_opened()\<CR>"
    end                                                        
endfunction                                                    

function! Auto_complete_opened()                               
    if pumvisible()                                            
        return "\<c-n>\<c-p>\<c-n>"                            
    else                                                       
        return "\<bs>\<C-n>"                                   
    end                                                        
endfunction                                                    

inoremap <expr> <Nul> Auto_complete_string()

これは、それが何をしているかを明確に示しています。で奇妙なことが起こっていAuto_complete_openedます。完了を行うだけでなく、完了を試みた後に次の 2 つの追加処理を実行します。

  • omn​​icompletion を使用しようとすると、何らかの形で が実行されますが<C-n><C-p><C-n>、これは単に に省略される可能性があり<C-n>ます。
  • 補完が失敗した場合、バックスペースを使用して再度補完を行います<C-o><C-x><C-n>、あまり意味がありません。

これが一部のユーザーの望むものではないと言っているわけではありませんが、ほとんどのユーザーが望むものではないでしょう! 私の短い答えはそれを信用して、それを編集する簡単な方法を提供します. 必要に応じて簡単に変更できるようになりました (たとえば、最初のエントリを最初から書きたい場合) <Down><C-n>

于 2013-08-28T11:01:32.930 に答える