2016-08-09 9 views
1

の左側の空白にimap`条件は、カーソルの左文字が、その場合には、ホワイトスペースでない限り、次のコマンドが有効で`カーソル

imap <Tab> <C-N> 

も持ってすることが可能であり、<Tab><Tab> (または興味深い変形として、カーソルの左ない限り、テキストは$は、カーソルの左側の文字列の末尾を表します^\s*$、一致する)をすべきですか?

編集:ソリューション@Meninx

によって提供されたリンクに

おかげで私は正確に私が望んで実装してvimのヘルプ

function! CleverTab() 
    if strpart(getline('.'), 0, col('.')-1) =~ '^\s*$' 
     return "\<Tab>" 
    else 
     return "\<C-N>" 
    endif 
endfunction 
inoremap <Tab> <C-R>=CleverTab()<CR> 

に以下のコードを発見しました。

+2

あなたはこの[リンク](http://vim.wikia.com/wiki/Smart_mapping_for_tab_completion)を確認することができますし、それから、あなたが機能を構築することができます。 –

答えて

3

inoremap<C-R>=は必要ありません。 inoremap<expr>引数を使用することが賢明です。最後の引数を式として評価し、その結果を置き換えます。

function! CleverTab() 
    if strpart(getline('.'), 0, col('.')-1) =~ '^\s*$' 
     return "\<Tab>" 
    else 
     return "\<c-x>\<c-p>" 
    endif 
endfunction 
inoremap <expr> <tab> CleverTab() 

ほとんどinoremapマップが<expr>で実行されているそれ以外のものはあまりにも速く、あまりにも複雑になり、次のようにあなたの例では、それはなります。

<C-N><c-x><c-p>に変更しました。ほとんどの場合、状況に応じた補完では、テキストを繰り返し使用するため、前方一致よりも後方一致を確認する方が良いでしょう。

また、私たちはウェブサイトのVimの特定の部分を持っている:https://vi.stackexchange.com/