NB Dies ist kein Duplikat von Wie funktioniert der Befehl "d3fg"? Bitte lesen Sie es, bevor Sie abstimmen, um zu schließen!
Ich bin in eine Sackgasse geraten, um zu erreichen, dass kleine Löschvorgänge wie große funktionieren . Das Problem, das ich habe, ist, dass ich nicht herausfinden kann, wie Befehle neu zugeordnet werden können d3d. Tatsächlich kann ich nicht einmal verstehen, wie sie überhaupt funktionieren, und ich kann in Vims Hilfe keine Erwähnung finden. *
d3jist einfach: es wendet die d
Bedienungsperson auf die 3j
Bewegung an,
3ddist auch einfach: es führt den dd
Befehl mit einem "count" von 3 aus.
d3d sieht so aus als sollte es unkompliziert sein, es wendet die d
bedienung auf die ... aber was ist das 3d
? Es ist keine Bewegung. Wenn Sie 3dalleine tippen , wird dies von Vim als Zählung behandelt, gefolgt von einem Operator, und es wird geduldig auf weitere Eingaben gewartet.
Und Sie können keine Operatoren auf andere Operatoren anwenden. ddwird in der Hilfe nicht als Folge von zwei Operatoren beschrieben. Es ist ein separater Befehl mit zwei Tasten. (vgl dc. was nix macht.)
Es scheint auch nicht der Fall zu sein, dass die Positionierung des Zählers für Befehle flexibel ist, die zwei Tastenanschläge erfordern: 2gjBewegt den Cursor zwei Bildschirmzeilen nach unten, g2jverwirft jedoch die ersten beiden Tastendrücke vollständig und bewegt den Cursor eine Zeile nach unten.
Wie funktioniert es? Ist dies nur ein Sonderfall in Vims internem Code? Kann ich auf irgendeine Weise ein d[count]d
Mapping erstellen ?
EDIT : Ist es ein Textobjekt? :h text-objects
Schließt es nicht in die Liste der "Befehle zur Auswahl von Textobjekten" ein, aber dann schließt es dd in eine Liste von Löschungen ein, die "von kleinen zu großen Objekten gruppiert" sind. Und d2awlöscht das Wort unter dem Cursor und das folgende. Auf der anderen Seite c2dtut nichts.
* Ich bin sicher, dass einige Erwähnungen existieren müssen, aber ich kann es nicht finden. Ich habe gelesen :help deleting
, :help motion.txt
und :helpgrep dNd
für alle Werte von N von 1 bis 9 versucht .
d
wirkt als Bestätigung; So ist es das gleiche wied3<CR>
.y3y
undc3c
funktionieren auch gleich ... Ich kann keine Dokumente dazu finden, obwohl entweder in der Vim: help, vi (1), nvi (1) oder der POSIX-Spezifikation ... Es verhält sich invi
undnvi
btw. gleich .dd
ist identisch mitd_
._
Bewegt den Cursor in der ([count]
-1) -ten Zeile nach unten zur ersten nicht leeren Zeile, die jedoch zeilenweise ist. Wenn Sie also mit einem Operator gepaart werden, werden ganze Zeilen bearbeitet. Aus diesem Grund ist es sinnvoll, dass eine Zählung zwischen den beidend
s auftreten kann.Antworten:
Vom Bediener ausstehender Modus
Zwischen einem Operator eingeben (wie
d
,c
, odergU
) und einer Bewegung (wiew
,i}
, oder/foo<CR>
), ist Vim in Operator angemeldeten Modus. Sie können Zuordnungen für erstellen diese mit:omap
und:onoremap
.In meinen Beispielen werde ich die Betreiber anhängigen zur Karte
d
zuw
. Dies ist eine zufällige Wahl, weil ich nicht weiß, wofür Sie es eigentlich verwenden wollten.Erstelle ein Omap
Lassen Sie uns eine Zuordnung für
d
im Operator-Pending-Modus erstellen . Ich gehe davon aus, dass wir hier VimScript schreiben (wie in Ihrem.vimrc
), also werde ich führende:
s weglassen .Das macht
dd
handeln wiedw
. Es macht auchd[count]d
sod[count]w
. Aber ich wette, Sie wollten das Verhalten vondd
(dh nicht[count]
geliefert) nicht beeinflussen.Ausdruckszuordnungen
Mit Ausdruckszuordnungen können Sie einen VimScript-Ausdruck auswerten, um die rechte Seite der Zuordnung zu erstellen. Der Ausdruck sollte eine Zeichenfolge ergeben. Ausdruckszuordnungen werden durch das
<expr>
Schlüsselwort gekennzeichnet.Vim hat auch einige eingebaute Variablen, die zu verschiedenen Zeiten gefüllt werden und oft während des Mappings nützlich sind. Eine davon ist
v:count
, welche[count]
einem Bediener oder einer Bewegung zugeführt wird.Lassen Sie uns das alles zusammenfassen. Wenn kein
[count]
zugeführt wird,v:count
wird sein0
. Wir können unser Mapping so einstellen,d
dass es nur in diesem Fall verwendet wird.Verhält
dd
sich jetzt wie der Standard (löscht eine Zeile),d[count]d
verhält sich aber wied[count]w
. Cool!Beschränken Sie die Verwendung nach dem
d
BedienerSie könnten jedoch etwas bemerken. Jetzt
cd
verhält sich auch socw
. Dies mag kein Problem sein, aber der Vollständigkeit halber beschränken wir es so, dass es nur nach demd
Operator funktioniert .Vim hat eine weitere Variable,
v:operator
die den zuletzt verwendeten Operator enthält. Lassen Sie uns das auch überprüfen, bevor wir etwas Besonderes tun.HINWEIS: Da
:map
Befehle verkettet werden können|
, müssen sie hier in unserem Ausdruck maskiert werden. So ist die logische ODER - Verknüpfung||
wird\|\|
.Cool, also
cd
undc[count]d
wieder nichts zu tun, wie früher. Dies ist gut, damit andere Plugins definieren könnencd
.Ich möchte nicht einfach eine andere Bewegung löschen
Wenn Sie
d[count]d
auf etwas völlig anderes abbilden möchten, das nichts mit dem Löschen von Text zu tun hat, können wir das auch erledigen.Wenn Sie Befehle im normalen Modus eingeben und versehentlich einen Befehl eingeben, können Sie diesen Befehl durch Drücken
<Esc>
von abbrechen. Gleiches gilt für Ihre Mappings.Lassen Sie uns
d[count]d
die aktuelle Zeile wie gewünscht ändern[count]
.Der letzte Teil der Abbildung ist ein VimScript expression:
<Esc>cc' . v:count . '<Esc>'
. Das heißt<Esc>
, Sie müssen den ausstehendend
Befehl abbrechen , danncc
die aktuelle Zeile ändern,v:count
den Wert von[count]
(im Einfügemodus) eingeben und<Esc>
zum normalen Modus zurückkehren. Beachten Sie, dass wir hier eine Zeichenfolge mit dem VimScript-Verkettungsoperator erstellen.
.Ihr tatsächlicher Anwendungsfall wird sich wahrscheinlich von dem unterscheiden, was ich hier skizziert habe, aber dies hilft Ihnen hoffentlich dabei, den Ball ins Rollen zu bringen.
Fröhliches Vimming!
quelle
:omap d d
(!) Tun , aber leider wird der Operator-Pending-Modus nie wirklich erreicht, weil ich für d eine Zuordnung vorgenommen habe, mit der die benutzerdefinierte Operatorfunktion festgelegt wird. Hoffentlich ist es möglich, Dinge zu optimieren, damit sied3d
funktionieren, wie es soll. (Lassen Sie mich wissen, wenn Sie Ideen haben, oder senden Sie eine vollständige Lösung für die andere Frage, wenn Sie dies bevorzugen.) Wenn ich es nicht bald herausfinden kann, werde ich dies akzeptieren und eine weitere, spezifischere Frage stellen. Vielen Dank!