2017-03-25 8 views
1

アクティブな行のカーソルの後に存在する場合は、挿入モードで ')'の後の位置にジャンプする必要があります。そうでない場合は、通常のTABとして機能します。私はVimscriptで検索を見つけたり、検索を1行に制限する関数を見つけたりすることはできませんでした。文字が見つかったかどうかを調べる方法はまだ分かりませんでした。 getline('.')を使用し、現在の行のテキストを取得するにはVimscriptで行の特定の文字にジャンプ

inoremap <TAB> :if (char_in_line(')')) | cursor_on_char() | a (append) | else '\t' | endif 
+0

あなたは ':help search()'を読んだことがありますか? – romainl

答えて

1

:だから疑似コードで、それは次のようになります。次に )がある場合はmatch()となります。 がない場合は-1を返し、存在しない場合は)ポジションがある場合は-1を返します。

^Rを挿入モードで使用すると、 式の結果を挿入できます。次に、伝統的なa?b:c(ヘルプ expr1を参照)のテストを使用して、適切な文字(タブまたは移動)を返します。 動きを戻すには、挿入モードで^Oを使用すると、 を挿入しないで通常のモードコマンドを実行できます。技術的には 対話的に実行されている間に、1つのコマンドしか実行できません。しかし、この のケースでは、Vimによって一度に挿入され、一度に という2つのコマンドを実行することができます。f)から)lに移動してカーソル の位置を調整します。一緒にすべてを置く

:inoremap <tab> <c-r>=match(getline('.'), ')') < 0 ? "\t" : "\<c-o>f)l"<cr> 

唯一の残りのビットは、このテストはカーソル 位置を考慮していないということです。しかし、match()が一致の位置を返すので、は結果をgetcurpos()[2]と比較できます(この 関数のヘルプも参照してください)。

はしかし、それよりも複雑なもののために、私はあなたが、あなた 願い(ヘルプは、特別:h function-list、あなたの友達です)とマップに この関数を呼び出すようにカーソルの位置を操作する機能で これを構築するお勧めします。

inoremap <tab> <esc>:call InsertSmartTab()<cr> 
関連する問題