vimで一致する中かっこを自動生成する

vimで一致する中かっこを自動生成する

vimで一致する中括弧を自動的に作成するには?

次のように動作する必要があります。開く中かっこを入力すると、閉じる中かっこが自動的に表示され、カーソルが中央に配置されます。中かっこのペアを離れるには、Ctrl-j組み合わせを使用してください。

自動支柱の挿入を提供するプラグインがたくさんあります。しかし、彼ら

  • Ctrl-j中かっこ分離ペアと異なるキーの組み合わせを使用するか、
  • 干渉多機能ハサミキーバインディング。

以下は期待どおりに機能します。

:inoremap ( ()<Esc>:let leavechar=")"<CR>i
:imap <C-j> <Esc>:exec "normal f" . leavechar<CR>a

ただし、これらの設定を使用すると、UltiSnipsスニペットは機能しなくなります。そのため、UltiSnipsを使用して閉じる中括弧を挿入します。

inoremap ( (<C-R>=UltiSnips_Anon('($1)$0', '(')<CR>

これはほとんど動作します。一致する中括弧が挿入され、スキップされた中括弧を使用できますCtrl-j。ただし、これは開いている中括弧の前にスペースがある場合にのみ機能します。

main () // works, the closing parentheses is added
main(   // fails without a space

私の解決策は、閉じた中括弧をスキップするために別のキーバインディングを必要とするか、開いている中括弧の前にスペースを必要とします。この問題をどのように解決しますか?

注:例として括弧を使用しています。かっこ、中かっこ、角かっこ、および下の記号と一緒に使用する必要があり、UltiSnips プラグインを妨げません。

答え1

vimで一致する中括弧を自動的に作成するには?

ご覧のとおり、この問題は簡単ではありません。簡単な答えは次のとおりです。プラグインを使用してください。自動終了またはスマート入力。素直に再マッピングすると([ ..キーを使用すると、数行の極端なケースが表示されます。これがまさにこれらのプラグインが作成された理由であり、プラグインがしばしば非常に複雑な理由です)。

だから私はUltiSnipsを使って閉じた中括弧を挿入しました。

次のことを試すことができます(元の提案とは異なります)。

inoremap ( ()<CR>=UltiSnips_Anon('$1)$0', ')')<CR>

UltiSnipsは一致に(含まれず、その中の行を分割します。mainこれにフラグメントプラグインを使用する際の問題は、(通常)ネストをサポートしていないため、次の(ネスト)フラグメントを挿入するときにジャンプ位置を忘れることです。

中かっこのペアを離れるには、Ctrl-j組み合わせを使用してください。

Ctrl-jUltiSnipsまたはクラッシュするプラグインを再マップできます。ドキュメントにマッピングがリストされていない場合は、:map/imap/nmap <key>ディスプレイマッピングを使用できます。Ctrl-jこれら2つのプラグインのジョブを選択して完了するには、次のものが必要です。

  1. あなたが想像するよりもはるかに進化しました。
  2. 私はあなたが本当に何かをしたくないと思います。

次のbashループを考えてみましょう。

while (( ${arr1[i]} < ${arr2[i<CURSOR>]} )); do
  [next_snippet_position_marker]
done

Ctrl-jこの場合、ループ本体に到達するには5回押す必要があります。閉じカッコを使用して、カッコを外れると、カーソルが実際に移動する位置をより効果的に制御できます。挿入されたペアを追跡し、Ctrl-jポップや移動に使用するスタックを実装できますが、スタックから中かっこを削除せずに手動で削除を開始すると問題が発生します。これで中括弧プラグインが解決しようとしている問題を解決し始めます。再発明しにくい車輪です。

Ctrl-jこれを拡張すると、中かっこを使用して元の要求を取得できます。そして破片。いくつかのダミー値を使用してフラグメントの位置を示し、それを閉じる中括弧でスタックにプッシュし、フラグメントまたは中Ctrl-j括弧の処理に対応するように動的に再マップする場合。しかし、どのような魔法が起こるべきかを調べるために、いくつかの高度な経験的方法を実装する必要があります。なぜなら、本質的に2つの問題を同時に解決しているからです。この問題は現在、フラグメント挿入プラグインと中括弧一致プラグインの作成者によってそれぞれ解決されています。そして、これらの問題をもう一度解決してください。彼ら便利さと魔法のためのソリューション。

これは、制御と利便性の問題に帰結します。この場合、コントロールはより良い結果をもたらすと思います。これは、これらの問題と関連するプラグインとキーマップを別々に維持する必要があることを意味します。それでも便利さが欲しいなら、可能ですが難しいです。

答え2

自動シャットダウンが少し遅れて、私の設定(UltisnipsとSupertab)にも邪魔になることがわかりましたが、Eclipse CDTをエミュレートする方法が好きです。

私は使う境界パートナーナビゲーションとインデントに役立つように、次のマップを使用して同じ結果を得ます。

imap <C-F> <C-G>g           " To jump out brackets in same line.
inoremap <C-K> <ESC>ki<TAB> " To move and insert an indent on the line before the current cursor (assuming empty line)

私はこのように使います。開いた部分を挿入し{ <CR><CR><C-K>、インデントされた内側の行に書き始めます。

答え3

個人的に使っています。スマート入力角かっこと引用符を自動的に挿入するために使用されます。たとえば、任意の場所を入力すると、カーソルが中央に配置され{ます。ブラケットグループを{}退会するには、を挿入します。 {}}

ただし、これはタブと括弧の外部ジャンプの要件をサポートします。また、角かっこの間に新しいキーを作成しませんが、とにかく追加のキーが必要です<CR>

<C-J>次の行に移動するようにマッピングできます。

:inoremap <C-J> <C-O>j

または、次の行の先頭に移動するには:

:inoremap <C-J> <C-O>+

答え4

私の考えでは境界パートナー必要なことを行います。

角かっこまたは引用符を自動的に閉じ、その間にカーソルを置きます。挿入モードで一対の角かっこを外すには+を実行できますが、Ctrl-g次の項目に追加してg再マップできます。Ctrl-jvimrc

% Jump out of a block of parentheses (uses delimitMate)
imap <C-j> <C-g>g

関連情報