Warum machen `cw` und` ce` dasselbe?

15

Das hat mich immer an den Befehlen wund Wmotion gestört - sie scheinen anders zu funktionieren, wenn sie mit dem cBefehl hange verwendet werden, als wenn sie alleine oder mit dem dBefehl elete verwendet werden.


Zum Beispiel mit dem Cursor auf das "q" dieses Textes:

The quick brown fox jumps over the lazy dog.

dwErgebnisse eingeben in

The brown fox jumps over the lazy dog.

und Eingabe deergibt

The  brown fox jumps over the lazy dog.

(Beachten Sie die beiden Leerzeichen zwischen "The" und "brown".)


Der yBefehl ank behandelt wund eunterscheidet sich auch, wie der Vergleich zeigt yeP:

The quickquick brown fox jumps over the lazy dog.

und ywP:

The quick quick brown fox jumps over the lazy dog.

Wenn Sie jedoch entweder ceslow<Esc>oder eingeben, erhalten Sie cwslow<Esc>dasselbe Ergebnis :

The slow brown fox jumps over the lazy dog.

Ist das irgendwo dokumentiert? Welche Logik steckt dahinter und wie kann ich die Ergebnisse eines Befehls vorhersagen, der verwendet wird w?

Platzhalter
quelle

Antworten:

18

Es ist ein besonderer Fall. Überprüfen Sie die Dokumentation für WORD unter "Sonderfall":

Sonderfall: "cw" und "cW" werden wie "ce" und "cE" behandelt, wenn sich der Cursor auf einem nicht leeren Feld befindet. Dies liegt daran, dass "cw" als Änderungswort interpretiert wird und ein Wort den folgenden Leerraum nicht enthält. {Vi: "cw", wenn auf ein Leerzeichen gefolgt von anderen Leerzeichen nur das erste Leerzeichen geändert wird; Dies ist wahrscheinlich ein Fehler, weil "dw" alle Leerzeichen löscht.}

Ein weiterer Sonderfall: Wenn Sie die "w" -Bewegung in Kombination mit einem Operator verwenden und das letzte überfahrene Wort am Ende einer Zeile steht, wird das Ende dieses Wortes zum Ende des bearbeiteten Textes und nicht zum ersten Wort im nächsten Linie.

Die ursprüngliche Vi-Implementierung von "e" ist fehlerhaft. Beispielsweise stoppt der Befehl "e" beim ersten Zeichen einer Zeile, wenn die vorherige Zeile leer war. Aber wenn Sie "2e" verwenden, geschieht dies nicht. In Vim sind "ee" und "2e" dasselbe, was logischer ist. Dies führt jedoch zu einer kleinen Inkompatibilität zwischen Vi und Vim.

Fruglemonkey
quelle
1
Neovim 0.2.1 fügt ein 'cpoptions'-Flag "_" (Unterstrich) hinzu, das dieses Verhalten umschaltet. neovim.io/doc/user/options.html#'cpoptions '
Justin M. Keyes
6

Der Unterschied zwischen dem Verhalten der Bewegung in cwvs. dwkann einfach erklärt werden: Wenn Sie ein Wort ändern möchten, lassen Sie normalerweise den Whitespace dahinter, während das Löschen eines Wortes darauf hindeutet, dass der Whitespace ebenfalls entfernt werden soll.

Wenn Sie das Leerzeichen aus irgendeinem Grunde gehen weg wollen (ich regelmäßig genug , um es kann aber ein Beispiel , das nicht denken) , dann die Verwendung awBewegung: caw.

Dash-Tom-Bang
quelle