Ich habe kürzlich festgestellt, wie gut Vim für das Golfen funktioniert, insbesondere für die Kolmogorov-Komplexität . Laut meta vim handelt es sich zumindest für den Umfang dieser Website um eine durchaus akzeptable Programmiersprache.
Welche allgemeinen Tipps haben Sie zum Golfen in Vim? Ich bin auf der Suche nach Ideen, die sich auf Code-Golf-Probleme anwenden lassen und die zumindest etwas spezifisch für Vim sind (z. B. "Kommentare entfernen" ist keine Antwort).
Bitte posten Sie einen Tipp pro Antwort.
Antworten:
Beachten Sie die Großbuchstaben der gängigen Befehle. Dies kann in vielen Kontexten trivial ein Tastendruck einsparen. Beispielsweise:
Eine andere ist die Verwendung
G
stattgg
, aber nur , wenn Sie eine Zählung verwenden! Beispiel: Ohne Zählung wirdgg
an den Anfang undG
an das Ende verschoben. Bei einer Zählung werden beide jedoch in die von Ihnen angegebene Zeile verschoben. Dies5G
ist kürzer als, aber gleichbedeutend mit5gg
.Eine andere ist die Verwendung
H
anstelle vongg
, es ist jedoch wichtig zu beachten, dass dies nur funktioniert, wenn Sie garantieren können, dass keine Eingabe mehr als die Standardanzahl von Zeilen belegt (ich glaube, dies ist 24, sie kann jedoch variieren).quelle
$
aber zumindestC
undD
würde etwas sparen).G
undgg
sind nicht gleichwertig. Ersteres geht zum Ende des Puffers und letzteres zum Anfang.5G
äquivalent zu5gg
. Ich werde einige Details zu diesem Punkt hinzufügen.Jedes Mal, wenn ein Befehl fehlschlägt, wird ein Klingelton ausgegeben, der das aktuelle Makro löscht. Sie können dies (ab) verwenden, um eine grobe Form einer Schleife zu erstellen. Zum Beispiel, wenn Sie die Tastenanschläge wiederholen möchten,
<foobar>
bis Ihr Puffer weniger als 3 Zeilen enthält. Du kannst tunwas bedeutet:
Es ist wichtig zu beachten, dass, wenn Sie dies in einer VIM-Sitzung testen, dies
@q
möglicherweise unbeabsichtigte Nebenwirkungen haben kann, da Makros von geladen werden.vim_profile
. Sie können dies auf verschiedene Arten umgehen. Die beste Lösung ist wahrscheinlich, vim mit zu startenSie können auch Ihre löschen
.viminfo
.Wenn Sie vim bereits gestartet haben, können Sie Folgendes eingeben
am anfang das makro auf null stellen.
Andere Bedingungen, durch die Sie das 3G ersetzen können, sind
oder
quelle
Es gibt verkürzte Versionen von ex-Befehlen, die Sie denken. Zum Beispiel wussten Sie wahrscheinlich schon, dass
:global
das gekürzt werden kann:g
, aber wussten Sie, dass dies:nnoremap
äquivalent ist zu:nn
?Es ist eine gute Idee,
:h :foo
alle ex-Befehle auszuführen, die Sie in Ihrer Antwort verwenden, um festzustellen, ob es eine kürzere Version gibt.quelle
ist immer äquivalent zu
was auch gleichbedeutend ist mit
überraschend genug. (Im Allgemeinen ist ohne Flags der letzte Schrägstrich in einem
:s
Ausdruck niemals erforderlich.)quelle
:%s/x
wird nicht jedes Vorkommen von x entfernt, sondern nur das erste in jeder Zeile.:&&
, um einen Ersatzbefehl und seine Flags zu wiederholen .Angenommen, Sie befinden sich im Einfügemodus und möchten einen einzelnen Befehl für den normalen Modus ausführen. Das könnten Sie so schreiben:
Mach es nicht so. Stattdessen
<C-o>
kehrt use , das einen einzelnen normalen Befehl ausführt, sofort in den Einfügemodus zurück.quelle
<CR>
after<foobar>
, um den Befehl zu senden?:
,/
oder?
)Es gibt drei "Änderungsfall" -Operatoren,
Da es sich um Operatoren handelt, werden sie bewegt, um das aktuelle Zeichen in Kleinbuchstaben umzuwandeln
Hier kommt der unterhaltsame Trick ins Spiel. :) Wenn Sie die Groß- und Kleinschreibung eines einzelnen Zeichens oder der aktuellen Zeile ändern möchten, ist diese im visuellen Modus um ein Byte kürzer. Zum Beispiel
gul
ist äquivalent zuUnd
gu_
(_ ist aktuelle Zeile) entsprichtDieser Trick funktioniert nicht zum Umschalten, da
v?
er im visuellen Modus eine Rückwärtssuche auslöst (genau wie beimv/
Bewegen in die entgegengesetzte Richtung), sodass Sie ihnvg?
stattdessen benötigen . Hier können Sie jedoch die~
Operator verwenden, um noch mehr Bytes zu sparen! (Danke @Doorknob für den Hinweis)Sie können diesen Trick in Aktion auf meiner VIM-Antwort hier und auf der entsprechenden V-Antwort auf und Post sehen.
quelle
~
, was die Groß- und Kleinschreibung des Zeichens unter dem Cursor umschaltet und eins nach rechts verschiebt!Das Alphabet in 10 Tastenanschlägen
Die ganze Anerkennung für diese Technik geht an Lynn, die sie zum ersten Mal in dieser Antwort verwendet hat . Ich schreibe es hier für die Nachwelt.
Verwenden Sie die folgenden zehn Tastenanschläge, um das Kleinbuchstaben-Alphabet zu ziehen:
(Wo
␍
ist ein Wagenrücklauf, dh die Eingabetaste.)Erläuterung
:h<_␍
Öffnet den Hilfebereichv_b_<_example
(ein Beispiel für eine visuelle blockweise Auswahl), der den Text enthältabcdefghijklmnopqrstuvwyxz
.jjY
Bewegt sich nach unten zu dieser Zeile und zieht sie an sich. Dann wirdZZ
das Hilfefenster geschlossen.quelle
Kennen Sie Ihre Register
Das Ziehen oder Löschen von Text in ein bestimmtes Register (z. B.
"aY
), um ihn später zu verwenden, ist nicht immer erforderlich. Vim hat mehrere Register, die automatisch mit den Subjekten verschiedener Befehle gefüllt werden. Geben Sie ein:help registers
, um sie alle zu sehen, aber hier sind einige besondere Hinweise:Unbenanntes Register:
""
- Der letzte Text, der gezerrt oder gelöscht wurde.Nummeriertes Register
"0
- Der letzte Text, der gezerrt wurde.Nummerierte Register
"1
-"9
- Der letzte Text, der gelöscht wurde, es sei denn, er bestand aus weniger als einer Zeile. Jedes Mal, wenn"1
es gefüllt wird, wird der vorherige Inhalt verschoben"2
und so weiter.Kleines Löschregister:
"-
- Der letzte Text, der kürzer als eine Zeile ist, die gelöscht wurde.Zuletzt eingefügter Text:
".
Insbesondere die
"-
und"1
können Register nützlich zusammen sein, so dass Sie einen Text mit zB löschendd
in das"1
Register und löschen einen anderen Text mitD
in die"-
(natürlich sind die Semantik nicht identisch, aber oft müssen sie nicht sein ).Es kann schwierig sein, alle Register im Auge zu behalten, aber Sie können den Inhalt aller Register jederzeit durch Eingabe abrufen
:registers
.quelle
Dies kam früher im Chat auf , also dachte ich, ich könnte es genauso gut als vollständigen Tipp posten.
<C-a>
und<C-x>
erhöhen und verringern Sie die nächste Zahl in der Zeile. Dies ist eine äußerst nützliche Funktion für einfache Berechnungen, ermöglicht aber auch einen ordentlichen kleinen Hack.Angenommen, Sie müssen zur nächsten Nummer springen. Zum Beispiel müssen wir uns ändern
zu
Der naheliegende Weg ist, zu der 2 zu springen und dann Folgendes zu tun:
Da ist das kürzer als
Es gibt viele verschiedene Möglichkeiten, um zur 2. zu springen.
Sowie viele andere Möglichkeiten.
Dies sind alle 2 (oder mehr) Tastenanschläge. Da jedoch
<C-a>
und<C-x>
nicht nur Inkrement / Dekrement - Zahlen, sondern auch auf die nächste Zahl springen, können wir ein Byte starten mitquelle
Golfere Bewegungen
Wenn Sie mit einem Textblock arbeiten (insbesondere bei Herausforderungen in der Ascii-Art ), müssen Sie häufig zum ersten oder letzten Zeichen im Puffer wechseln.
G
undgg
sind ziemlich gut, aber es gibt einige ärgerliche Dinge. Um beispielsweise das letzte Zeichen zu erhalten, müssenG$
undgg
werden Sie nicht unbedingt in die erste Spalte gesetzt, wenn ein führendes Leerzeichen vorhanden ist. Hier sind einige schönere Bewegungen, obwohl sie nur funktionieren, wenn Ihr Text keine leeren Zeilen in der Mitte enthält:Erstes Zeichen des Puffers:
{
ist besser alsgg0
. Befinden sich in der Mitte des Textes leere Zeilen, können Sie auch verwendengo
, um zum ersten Zeichen im Puffer zu gelangen.Letztes Zeichen des Puffers:
}
ist besser alsG$
Diese dienen auch als Argument für einen Bediener, beachten Sie jedoch, dass es sich um zeichenweise Bewegungen handelt, nicht um linienweise Bewegungen!
quelle
H
ist Golfspieler alsgg
H
ist nicht zuverlässig. Das Verhalten hängt von der Größe des sichtbaren Fensters und der Position im Puffer ab. (Es ist in V neu abgebildet, um diese Verwirrung zu vermeiden)Berechnen Sie mit dem Ausdrucksregister
Sie können Berechnungen sowohl im normalen Modus als auch im Einfügemodus durchführen.
Normaler Modus
Wenn Sie im normalen Modus
@=
den Cursor eingeben, gelangen Sie in die Befehlszeile, in der Sie einen beliebigen Ausdruck eingeben können. Wenn Sie die Eingabetaste drücken, wird das Ergebnis des Ausdrucks als Normalmodusbefehl ausgeführt.Angenommen, Sie möchten in die mittlere Spalte der aktuellen Zeile wechseln. Der Funktionsaufruf
col('$')
gibt die Anzahl der Spalten in der Zeile zurück. Um dies zu erreichen, geben Sie Folgendes ein:Wenn Sie die Eingabetaste drücken, kehrt der Cursor zum Puffer zurück und vim wartet auf einen Operator (wie
|
), als hätten Sie gerade eine Nummer eingegeben. Alternativ hätten Sie Folgendes eingeben können:... aber das sind natürlich mehr Bytes.
Einfügemodus
Sie können das Ausdrucksregister auch im Einfügemodus verwenden, indem Sie
<Ctrl-r>=
anstelle von drücken@=
. Dies funktioniert im normalen Modus genauso, mit der Ausnahme, dass das Ergebnis des von Ihnen eingegebenen Ausdrucks im Einfügemodus ausgeführt wird. Wenn Sie beispielsweise tippen<Ctrl-r>=col('$')<CR>
, wird die Anzahl der Spalten in der aktuellen Zeile so am Cursor eingefügt, als hätten Sie sie eingegeben.Geben Sie ein, um weitere Informationen zum Ausdrucksregister zu erhalten
:help "=
.Ausdrücke wiederverwenden
Der zuletzt verwendete Ausdruck wird im Ausdrucksregister gespeichert
"=
. Wenn Sie@=<CR>
im normalen Modus oder<Ctrl-r>=<CR>
im Einfügemodus tippen, wird der Ausdruck erneut ausgewertet, sodass Sie sie ähnlich wie Makros verwenden können.Berechnen Sie in Substitutionen
Sie können Ausdrücke auch dann auswerten, wenn Sie reguläre Ausdrücke ersetzen. Alles was Sie tun müssen, ist Ihre Substitution mit zu beginnen
\=
. Angenommen, Sie möchten die Zeilen in dieser Datei nummerieren:Der Funktionsaufruf
line('.')
gibt die aktuelle Zeilennummer zurück, sodass die Arbeit einfach ist. Eingabe:... ergibt das gewünschte Ergebnis:
Um erfassten Gruppen in einem solchen Ausdruck verwenden Sie die verwenden können ,
submatch()
Funktion, wo zBsubmatch(0)
äquivalent ist\0
in einer gewöhnlichen Substitution,submatch(1)
entspricht\1
usw. Diese eats up viele Tastenanschläge, leider.Geben Sie ein, um weitere Informationen zur Ersetzung von Ausdrücken zu erhalten
:help sub-replace-expression
.quelle
i1 <esc>bqqywjPb<C-a>@qq@q
handelt es sich um eine reine Normalmoduslösung, die 5 Byte kürzer ist. Und wenn Sie unter Unix arbeiten, können Sie dies sogar tun:%!nl
. Trotzdem gute Tipps!Sie können den Text eines Makros direkt ändern, der erheblich kürzer sein kann als eine gewundene Bedingung. Angenommen, Sie möchten n- mal etwas einfügen , wobei n eine Benutzereingabe ist. Ich habe zuerst versucht, dies zu tun:
Erläuterung:
Dies sind 18 Tastenanschläge und eine wirklich hässliche Methode, dies zu tun. Wechseln Sie stattdessen zum Speicherort dieser Nummer und gehen Sie folgendermaßen vor:
Erläuterung:
Dies sind 9 Tastenanschläge, eine enorme Verbesserung.
Bearbeiten:
Noch kürzer ist es, das Makro für Ihre Nummer auszuführen und dann Ihren Befehl einzugeben. Beispielsweise:
Erläuterung:
7 Tastenanschläge.
quelle
D
nichtdd
. 2. Wenn der Befehl keine Register enthält, können Sie ihn noch kürzer machen. Zum Beispiel, wenn Sie das Zeichen wiederholen wollenx
so oft wie die Zahl unter dem Cursor, statt"qD@qix<esc>
, VerwendungD@"ix<esc>
.