
Befehlen in VIM können Zahlen vorangestellt werden, aber das Nummerierungsschema ist für einige Vorgänge nicht einheitlich.
Wenn den Bewegungsbefehlen links, unten, oben und rechts (H, J, K, L) eine Zahl vorangestellt wird, springt der Cursor an die erwartete Position, 1L
bewegt sich also beispielsweise ein Zeichen nach rechts.
:m+N
Die aktuelle Zeile kann mit oder nach oben oder unten verschoben werden . Um den gegenteiligen Effekt von zu erzielen, :m-N
müssen Sie allerdings verwenden .:m-2
:m+1
Ich verwende auch VSVim in Visual Studio 2019 und verwende die Befehle gt
und gT
, um zwischen Registerkarten zu wechseln. Wenn ich drei Registerkarten geöffnet habe und mich derzeit auf der ersten Registerkarte befinde (ganz links), 3gt
wechselt die Verwendung zur dritten Registerkarte. Wenn ich mich auf der dritten Registerkarte befinde (ganz rechts), 2gT
wechselt die Verwendung zurück zur ersten Registerkarte, während 3gT
die Verwendung dazu führt, dass ich auf derselben Registerkarte bleibe.
Warum müssen unterschiedliche Zahlen verwendet werden, um entgegengesetzte Effekte zu erzielen? Handelt es sich hier möglicherweise um einen Konstruktionsfehler, der einfach nie behoben wurde?
Antwort1
Ihre Beobachtung, dass es hier Unstimmigkeiten gibt, ist richtig.
Obwohl es {count}
am häufigsten verwendet wird, um eine Aktion zu wiederholen, ist das nicht immer der Fall. Manchmal wird es als absolute Zahl verwendet, um beispielsweise 47G
zu Zeile 47 zu gelangen, 35|
zu Spalte 35 in der aktuellen Zeile zu gelangen oder 90%
zu einer Zeile 90 % in der Datei zu gelangen.
Manchmal wird es nur verwendet, um verschiedene Varianten desselben Befehls zu kennzeichnen. Beispielsweise CTRL-G
gibt Informationen über die im aktuellen Puffer geöffnete Datei aus. 1 CTRL-G
gibt diese Informationen aus, zeigt aber den vollständigen Pfad zur Datei an. 2 CTRL-G
(oder eine beliebige größere Zahl) gibt dasselbe aus und gibt auch die Nummer des Puffers in die Ausgabe ein. (Siehe:help CTRL-G
für Details.)
Auf Ihre konkreten Beispiele eingehen:
Wenn den Bewegungsbefehlen links, unten, oben und rechts (
hjkl
) eine Zahl vorangestellt wird, springt der Cursor an die erwartete Position,1l
bewegt sich also beispielsweise ein Zeichen nach rechts.
Dies ist die typische Verwendung von {count}
als Wiederholung des Befehls.
:m +N
Die aktuelle Zeile kann mit oder nach oben oder unten verschoben werden . Um den gegenteiligen Effekt von zu erzielen,:m -N
müssen Sie allerdings verwenden .:m -2
:m +1
Erstens ist dies nicht wirklich ein {count}
, sondern ein {address}
. Dieses ist tatsächlich konsistent (auch wenn Sie es auf den ersten Blick vielleicht seltsam finden.) Der :m
Befehl verschiebt die aktuelle Zeileuntendie durch die Adresse angegebene Zeile.
Wenn Sie sich in Zeile 47 befinden, würden Sie verwenden, :m 48
um es unter die folgende Zeile zu verschieben. Da die aktuelle Zeile verschoben wird, ist die Zeile, die vorher 48 war, jetzt 47, und die aktuelle Zeile ist 48. Wenn Sie es jetzt an die ursprüngliche Position zurückhaben möchten, benötigen Sie :m 46
, da esuntendie Zeile mit der Adresse +1
ist einfach eine Abkürzung zu 48 (beginnend in Zeile 47) und -2
ist nur eine Abkürzung für 46 (während sie sich jetzt in Zeile 48 befindet). Macht Sinn, oder?
Wenn Vim beschlossen hätte, die Linie zu verschieben,überdie Adresse, wenn die Adresse davor steht, dann würde das Verhalten eines Befehls wie :m 46
davon abhängen, ob die aktuelle Zeile darüber oder darunter liegt, und das wäre nicht gut. Daher entschied Vim, dass Konsistenz bei diesem Faktor wichtiger sei.
Ich verwende die Befehle gt und gT, um zwischen Registerkarten zu wechseln. Wenn ich drei Registerkarten geöffnet habe und mich derzeit auf der ersten Registerkarte (ganz links) befinde, wechselt 3gt zum dritten Tab. Wenn ich mich auf der dritten Registerkarte (ganz rechts) befinde, wechselt 2gT zurück zum ersten Tab, während 3gT dazu führt, dass ich auf derselben Registerkarte bleibe.
Ja, das ist tatsächlich inkonsistent, aber es gibt einen Grund dafür.
Bei der Implementierung von Tabs entschieden die Vim-Autoren, dass es wichtiger sei, schnell zu Tab „N“ zu wechseln, als „N“ Tabs zu überspringen. Letzteres ist nur selten nötig. Daher entschieden sie sich, {count}
als absolute Tab-Nummer für den gt
Befehl zu verwenden.
Andererseits besteht für den gT
Befehl keine große Notwendigkeit, dieDasselbeVerhalten (Sie hatten dafür bereits einen einfacheren Tastendruck), daher wurde die Wiederholungsbedeutung {count}
dort belassen. Wenn also jemand „N“ Tabs überspringen möchte, könnte dieser Befehl hilfreich sein …
Beachten Sie, dass es auf diese Weise möglich ist, die drei Befehle (nächste Registerkarte, vorherige Registerkarte, gehe zu Registerkarte „N“) zu haben und dabei nur zwei Befehle zu benötigen, gt
und gT
dass es ziemlich wichtig ist, weniger Befehle zu haben, da Vim bereits zu viele davon hat, als dass wir sie uns merken könnten!