Inkonsistenz des VIM-Nummerierungsverhaltens

Inkonsistenz des VIM-Nummerierungsverhaltens

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, 1Lbewegt sich also beispielsweise ein Zeichen nach rechts.

:m+NDie aktuelle Zeile kann mit oder nach oben oder unten verschoben werden . Um den gegenteiligen Effekt von zu erzielen, :m-Nmüssen Sie allerdings verwenden .:m-2:m+1

Ich verwende auch VSVim in Visual Studio 2019 und verwende die Befehle gtund gT, um zwischen Registerkarten zu wechseln. Wenn ich drei Registerkarten geöffnet habe und mich derzeit auf der ersten Registerkarte befinde (ganz links), 3gtwechselt die Verwendung zur dritten Registerkarte. Wenn ich mich auf der dritten Registerkarte befinde (ganz rechts), 2gTwechselt die Verwendung zurück zur ersten Registerkarte, während 3gTdie 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 47Gzu 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-Ggibt Informationen über die im aktuellen Puffer geöffnete Datei aus. 1 CTRL-Ggibt 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-Gfü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, 1lbewegt sich also beispielsweise ein Zeichen nach rechts.

Dies ist die typische Verwendung von {count}als Wiederholung des Befehls.

:m +NDie aktuelle Zeile kann mit oder nach oben oder unten verschoben werden . Um den gegenteiligen Effekt von zu erzielen, :m -Nmü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 :mBefehl verschiebt die aktuelle Zeileuntendie durch die Adresse angegebene Zeile.

Wenn Sie sich in Zeile 47 befinden, würden Sie verwenden, :m 48um 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 +1ist einfach eine Abkürzung zu 48 (beginnend in Zeile 47) und -2ist 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 46davon 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 gtBefehl zu verwenden.

Andererseits besteht für den gTBefehl 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, gtund gTdass es ziemlich wichtig ist, weniger Befehle zu haben, da Vim bereits zu viele davon hat, als dass wir sie uns merken könnten!

verwandte Informationen