なぜci "が引用された領域の外にあり、ci(が括弧内でのみ機能するのでしょうか?


27

ci"カーソルを使用する場合、二重引用符で囲まれた領域に存在する必要はありません。

|String somestring = "some text";

パイプがカーソル位置であるci"と仮定すると、引用された領域にジャンプします。

一方、を使用するci(場合、カーソルは括弧内にある必要があり、括弧内でカーソルを移動しません。

この動作の違いの理由は何ですか?この動作が存在するようにキーをマップする方法があると思います。これを行うことに欠点はありますか?


回答:


25

ここでの主な違いは、括弧で囲まれた文(でターゲットci()はネストできますが、引用符で囲まれた文字列(でターゲットci")はネストできないことです。

カーソルが括弧で囲まれたステートメントの外側にある場合、カーソルは他のステートメントの内側にある可能性があります。例(*カーソル位置をマーク):

$foo = array(
    'x' => ar*ray(1, 2, 3),
);

カーソルが置かれている行にはが含まれ(1, 2, 3)ていますが、カーソルは大きなarray(...)ブロック内にもあります。この場合、大きい方がの適切なターゲットですci(

カーソルが引用符で囲まれた文字列の外側にある場合、それらはネストできないため、完全に賢明なことはありません。そのため、Vimはライン上の最初の引用符付き文字列を見つけて利用します。


10

テキストオブジェクト(の引用ファミリはi'i"a'、およびa")、彼らは現在の行だけを見ていることにあるテキストオブジェクトの残りの部分よりも異なっています。このため、カーソルが引用符内にある必要がないように選択されました。代わりに、カーソルが引用符で囲まれた文字列内にない場合、Vimは行内を前方に検索します。

この前方検索の動作をブロックベースのテキストオブジェクトにも実装できるようにするパッチについての議論があります。


8

他の答えはこれがなぜ起こるかをカバーしました。これを回避する良い方法があります。

wellle / targets.vim。私は最近このプラグインを見つけましたが、非常に過小評価されていると思います。これは、新しいテキストオブジェクトを提供する:din(ニーモニックを:(D)elete(I)のn側(n)がEXT「(」これは以下のような他の演算子と複数の異なるオブジェクトと互換性がありan(in"il((最後の括弧内)

また、のデフォルトの動作をオーバーライドするi(ため、最初にカーソルが括弧内にあるかどうかを確認し、そうでない場合はと同じように機能しin(ます。この動作はオンまたはオフにできます。例えば:

def foo(bar):
^cursor here

カーソルが括弧内にないため、入力ci(はと同じようcin(に機能します。

def foo( ):
        ^Cursor here, and in insert mode

これもカウントを受け入れます。

def foo(bar):           #Define function foo(bar)
^cursor here

入力c2in(

def foo(bar):           #Define function foo( )
                                             ^cursor here

これは、新しいオブジェクト「引数」も提供します。たとえば、dana「次の引数の周りを削除する」という意味です。これもカウントを受け入れます。例えば:

def foo(arg1, arg2, BADarg3):
^ cursor here

入力d3ana

def foo(arg1, arg2):
                  ^ cursor here

このプラグインには他にも多くの機能がありますが、これらは基本的な機能です。


1
いいね!これは良い追加です。私はそれをチェックアウトする必要があるかもしれません。
リーバー

グレート答え10/10けど例のpythonているので、私はそれを9/10を与える奨め
Downgoat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.