なぜ `cw`と` ce`は同じことをするのですか?


15

これはwWモーションコマンドとモーションコマンドについていつも私を悩まcせてdきました。それらは、hangeコマンドと一緒に使用した場合、単独で使用した場合とeleteコマンドで使用した場合とでは動作が異なります。


たとえば、このテキストの「q」にカーソルを置きます。

The quick brown fox jumps over the lazy dog.

タイピングのdw結果

The brown fox jumps over the lazy dog.

入力deすると

The  brown fox jumps over the lazy dog.

(「The」と「brown」の間の2つのスペースに注意してください。)


yANKコマンドも扱いwe異なり、などと比較することによって示すことができますyeP

The quickquick brown fox jumps over the lazy dog.

およびywP

The quick quick brown fox jumps over the lazy dog.

ただし、どちらceslow<Esc>cwslow<Esc>を入力しても同じ結果になります

The slow brown fox jumps over the lazy dog.

これはどこかに文書化されていますか?その背後にあるロジックは何wですか?また、使用するコマンドの結果をどのように予測できますか?

回答:


18

それは特別な場合です。「特別な場合」の下のWORDのドキュメントを確認します

特別な場合:「cw」および「cW」は、カーソルが非ブランクにある場合、「ce」および「cE」のように扱われます。これは、「cw」が単語の変更として解釈され、単語に次の空白が含まれていないためです。{Vi: "cw"が空白の後に他の空白が続く場合、最初の空白のみが変更されます。「dw」はすべての空白を削除するため、これはおそらくバグです}

別の特殊なケース:演算子と組み合わせて「w」モーションを使用し、最後に移動した単語が行の終わりにある場合、その単語の終わりは、次の最初の単語ではなく、操作されたテキストの終わりになりますライン。

「e」の元のVi実装にはバグがあります。たとえば、前の行が空だった場合、「e」コマンドは行の最初の文字で停止します。しかし、「2e」を使用すると、これは起こりません。Vimでは、「ee」と「2e」は同じであり、より論理的です。ただし、これによりViとVimの間にわずかな非互換性が生じます。


1
Neovim 0.2.1では、この動作を切り替える「cpoptions」フラグ「_」(アンダースコア)が追加されています。neovim.io/doc/user/options.html#'cpoptions '
ジャスティンM.キーズ

6

cw対のモーションの動作の違いdwは簡単に説明できます。通常、単語を変更したい場合は、それに続く空白を残しますが、単語を削除すると空白も削除することを提案します。

何らかの理由で空白を消したい場合(私は十分に定期的にそれを行いますが、例を考えることはできません)、awモーションを使用しますcaw

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.