web-dev-qa-db-ja.com

VIM:タブはオムニコンプリートですが、行頭にはありません

VIM 7.3:でTabをOmnicompetionとして設定しました

inoremap <Tab> <C-n>

これは便利ですが、行の先頭に通常のタブを戻したいと思います。前の文字が空白であるか行頭であるかを確認する方法はありますか?そうである場合は、完全ではなくタブ文字を挿入しますか?

ありがとう!

6
dotancohen

私はこれをしばらくの間使用しています:

function! InsertTabWrapper()
    let col = col('.') - 1
    if !col || getline('.')[col - 1] !~ '\k'
        return "\<tab>"
    else
        return "\<c-p>"
    endif
endfunction

inoremap <tab> <c-r>=InsertTabWrapper()<cr>

これにより、カーソルが行の先頭にある場合、またはWord上にない場合に、通常はTabキーを使用できます。それ以外の場合は、control-p完了キーが実行されます。 cp>より便利です。

[私はそれを修正しましたが、これの元のアイデアはおそらくVimユーザーのメーリングリストから来ましたが、どこで入手したかについては何もメモしていませんでした。]

12
Heptite

一歩戻って文字を比較し、それに応じて動作するやや複雑な関数を考えることができますが、私はむしろ古い「あなたは何をしていますか本当にしようとしているのですか?」質問:

使用することをお勧めします Ctrl+T 代わりに、挿入モードで行をインデントします。それがallの場合は、タブボタンが必要です。私は個人的に、そのような位置依存キーを持つことは意味的に非常に混乱していると思います。

2