vimでは、一致する中括弧/括弧を後方検索します


9

ご存じの方も多いと思いますが%、次のペアのブレース/ブラケット/括弧を前方に検索して、一致するパートナーに移動することができます。

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

行を逆方向に検索する同様のキーがあることを願っています。例:

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

ほとんどのvimコマンドには逆方向と順方向の両方があるので、そうする必要があるようです。パートナーはいませんか?もしそうなら、それはだ後だからであるペア文字が同じに行動するだろうか?


%同じ行で対になっているブラケットを検索するだけでなく、ファイルのさらに下にあることに注意してください。私は特に、選択した任意のプログラム言語のループなどでそれが好きです。
Bernhard

1
@Bernhardはい、ただし、行に中括弧の1つが見つかった場合のみ。
ケビン

アドオンスクリプトに反対していない場合、matchitアドオンは、g%探しているものと同様のコマンドを提供します。
jw013 2012年

ばかげているが、あなたの質問はあなたがなぜパートナーがいないのか知りたいと述べています。「知らない相手はいるの?」という意味ですか?:)
rjewell 2012年

@rjewell OK、それを分割したので、技術的にそれを要求することはもうありません。
ケビン

回答:


4

あなたがいる場合、実際に一般的なマッチング文字を逆方向に検索したい、あなたはこれらのいずれかを使用することができますvim固有のコマンドを実行します。

  • [(...(前の一致しない(文字に移動)
  • [{...(前の一致しない{文字に移動)

これらの2つのコマンドには、一致する転送パートナーがあります。

  • ])...(次の一致しない)文字に移動)
  • ]}...(次の一致しない}文字に移動)

#ifdefCのコメントには、同様のコマンドが他にもあります。

vimコマンドを使用すると、さらに多くの情報を見つけることができます:help %


私はこれらを知っていますが、問題は、一致しないペアを見つけることです。一致するペアを見つける必要があります。
ケビン

@ケビン:私はドキュメントを誤解しました(ため息)。もちろん、一度使用%すると、一致するパートナーを見つけるという両方の方向に進みます。また、ブロック内の場合、上記のコマンドは適切な一致を見つけます。
メイ

3

%一致するブラケットを見つけます。だからあなたがいる場合(または{それは前方に検索します

}または)を使用している場合は、逆方向に検索されます。

%は方向性がなく、一致するブラケットを見つけるだけです。


私がペアの片側にいる場合、%はペアを見つけます。行の終わりにいる場合は、それより前のペアは見つかりません。
ケビン

これは正しい答えを選択する必要はありませんか?
ジャック

2

私は試してみました:map ^] ^%%^]= Ctrl+ v Ctrl+ 5のアナロジーとして、ここでは%= Shift+ +で5)。

与えられた特定のケースで機能しますが、カーソルから後方に検索しないため、常に行の最初の左括弧を選択し、一致が見つからない場合はカーソルを行の先頭に残します。


これはより良いソリューションです。それは醜く、おそらく単純化する余地はたくさんありますが、セマンティクスは正確だと思います(開いている括弧がない場合はカーソルを移動せず、現在の列の前の最初の開いている括弧に移動します)。

:map ^] ^[:call search("[({[]", "bes", line("."))^M

ために

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return

行にネストされていないペアが2つある場合、これはまったく同じではありませんが、これまでのところ、これは最善の提案です。
ケビン

これはブロック内でのみ機能しますよね?その場合、[(同様に機能し、を必要としませんmap
メイ

はい、現在の行で始まるブロックがなければなりません。私はより完全な解決策を見つけましたが、編集は来ます...
役に立たない
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.