vi/Vim: アクションの組み合わせで削除/変更(d/c)するときに奇妙な点

vi/Vim: アクションの組み合わせで削除/変更(d/c)するときに奇妙な点

vi(m)のいくつかの動作を見てみましょう。サンプルラインを使用しました。

AA BBB

これらの調査の主題として、各実験について行の先頭にカーソルを置き、通常モードで開始しました。実験は通常モードでも終了し、rX最終カーソル位置を示す閉じる操作を追加しました。

tB、、、、 4つfBwアクションを見てください3l。最初はカーソルを前のスペースに移動し、BBB他のものは最初のスペースに移動しますB。それは、

tBrX        # AAXBBB
fBrX        # AA XBB
wrX         # AA XBB
3lrX        # AA XBB

次に、ドキュメントが削除コンテキストでこれらの移動を実行する方法を見てみましょう。

  • ウィム:

    d{motion}       Delete text that {motion} moves over
    
  • FreeBSD vi(1) のマニュアルページ:

    d motion
        Delete the region of text described by ... motion
    

したがって、これは削除と動きの構成に関する単純で明確な概念を表します。この時点で、削除範囲が含まれているか排他的であるかを除いて、ほとんどすべてが明確に見えます。移動後に場所を削除するか維持するかを指定します。

もしそうなら排他的、上記の作業の接頭辞を使用する場合は、以下dをすべて削除する必要がありますX

dtBrX       # XBBB
dfBrX       # XBB
dwrX        # XBB
d3lrX       # XBB

もしそうなら含まれる、上記の位置Xも削除されるため、最終位置は後続の位置です。つまり、別の文字が飲み込まれるため、次のような結果が得られます。

dtBrX       # XBB
dfBrX       # XB
dwrX        # XB
d3lrX       # XB

今どのように見えるか見てみましょう実生活:

dtBrX       # XBB
dfBrX       # XB
dwrX        # XBB
d3lrX       # XBB

つまり、構成は次のようになります。含まれるしかし、最初の2つのタスクの場合排他的後者の場合!これを説明できる原理はありますか?


また、cVimのドキュメントに で説明されていますDelete {motion} text and start insert。仕様によると、次の後に通常モードに戻ると、次のcようc{motion}<ESC>lな効果があると予想されます。d{motion}vimの `ESC`がカーソルを元の位置に戻すのはなぜですか?<ESC>カーソルを左に移動させる効果があるため、l通常/挿入モードを前後に位置を維持するには補償が必要です)。ほぼ終わりました。

ctB<ESC>lrX # XBB
cfB<ESC>lrX # XB
cw<ESC>lrX  # XBBB
c3l<ESC>lrX # XBB

...c次のように組み合わせると、他の効果のみが表示されますw。この操作は前の空白、BBBつまり移動されたターゲットの前の文字も保存します!この行動の論理は何ですか?

答え1

dそれ自体は包括的でも排他的でもありません。これ運動はい。各モーションのヘルプは、包括的なものか排他的なものかを示します。

                                                       f
f{char}                 To [count]'th occurrence of {char} to the right.  The
                        cursor is placed on {char} |inclusive|.

                                                        t
t{char}                 Till before [count]'th occurrence of {char} to the
                        right.  The cursor is placed on the character left of
                        {char} |inclusive|.
<S-Right>       or                                      <S-Right> w
w                       [count] words forward.  |exclusive| motion.

l               or                                      l
<Right>         or                                      <Right> <Space>
<Space>                 [count] characters to the right.  |exclusive| motion.

詳細については、次を参照してください。:h inclusive

つまり、構成には最初の2つの楽章が含まれますが、最後の2つの楽章は除外されます。これを説明できる原理はありますか?

fとはt包括的wで排他的と見なすことができますl


w と併用するとc他の効果があります。この操作は以前のスペースも保存しますBBB

これは文書にも記載されている特別なケースです。もう少し下を見てください:h word:

Special case: "cw" and "cW" are treated like "ce" and "cE" if the cursor is
on a non-blank.  This is because "cw" is interpreted as change-word, and a
word does not include the following white space.

関連情報