33

ci" ci' ci( ci[私たちは皆、 ...が何をするかを知っています。日常の編集にとても重宝します。何かおかしいと思ってヘルプを調べてみましたが、原因がわかりませんでした。

たとえば、次のファイルがあります。

foo "target"
foo 'target'
foo (target)
foo {target}
foo [target]
foo <target>

カーソルが各行の先頭f(' ') にある場合、ci", ci', ci(...

引用符(一重または二重)でのみ機能し、cix括弧では機能しません。なぜ彼らは異なる振る舞いをするのですか?

( dixvix同じ)

--noplugin、vim 7.3 でテスト済み

ありがとうございました。

アップデート

答えてくれてありがとう@romainl。「vimでのペア処理」についてはまだ疑問があります

この例を確認してください:

foo "targ\"eti\" some\"thing else "

上記のような行がある場合、入力ci"します 、カーソルが先頭または引用符の間にある場合でも、完全に機能します.vimには「ペア」のアイデアがあるようです?

そして、これはおそらくあなたがペアリングについて何を意味したのですか?

foo "target x some"thing else "
foo (target x some(thing else )

上記の 2 行があります。(cursor at x) と入力するci"ci(、2 行目には何も起こりませんでしたが、最初の行は次のように変更されました。

foo "I"thing else " (I is cursor)
4

2 に答える 2

27

ci(ci[ci{およびcitその他すべてのと一貫性があり<action>i<something>ます。彼らのようにのみ動作ci'します。ci"ここでは外れ値は引用符であり、括弧ではありません。

Vim は、引用符がペアであるのに対し、ブラケットはペアであるとは見なしません。実際のペアでは機能しますが、引用符では機能しないペアを一致させるための内部ロジックがあるため、動作が異なります。

その不一致について不平を言うのはあなたが初めてではありません。これは 1 つの解決策であり、他の解決策を見つけることができるかもしれません。

編集

残念ながら、私は Vim の内部構造について深い知識を持っていないので、ここでは推測することしかできません。

Vim に頼むci"と、二重引用符のペアを見つけるために最善を尽くしますが、二重引用符はペアではありません: a"が角かっこに反して閉じているものなのか、開いているものなのかを判断する方法はありません。そのため、Vim はいくつかの選択をしなければなりません。IMO、家族の他のメンバーがどのように機能するかを考えると、最も理にかなっている選択は、カーソルが引用符の間にあると仮定し、右の最初のものから左の最初のものまで選択することです. この方法が何らかの理由で間違っていることが判明したか、何らかの理由で機能しなかったため、他の方法 (現在の方法) が普及したとしか考えられません。

別の説明としては、メカニズムが引用符を正しく処理できi<something>ない特定のサブシステム (おそらく ? と同じ) に関連付けられている可能性があります。showmatch

とにかく、あなたと同じように、私はこの不一致を奇妙に感じ、どういうわけかそれを内面化し、 の使用法を<action>i"他の人の動作に合わせました。!!の代わりに実際に行う2t"ci"か、いくつかのバリアントに ci"非効率です、私は知っています。

読みました:h a'か?問題の「限定的な理解」をどこで得たのかを完全に忘れていましたが、そこにありました! それは言います:

「1行内でのみ機能します。カーソルが引用符で始まると、Vimは行の先頭から検索して、どの引用符のペアが文字列を形成するかを判断します。」

そこから私が得たものは次のとおりです。私たちには不明な理由で、Vim は引用符のマッチングに他のペアとは別のメカニズムを使用していci"ますcib。根本的な原因はまったく明らかではありませんが、全体像が私が想像するものと非常によく似ていることはかなり確信しています.

私には、それは機能を装ったバグまたは制限のように見えます。

それでも興味がある場合は、 vim-devでさらに質問することをお勧めします。

于 2013-02-01T17:07:33.377 に答える