Wenig bekannte, aber besonders nützliche Vim-Funktionen

Aus LinuxUser 11/2024

Wenig bekannte, aber besonders nützliche Vim-Funktionen

© Muhammad Jailani / 123RF.com

Federleicht durch Vim

Im Editor-Urgestein Vim verstecken sich zahlreiche großartige Funktionen, die oft selbst alte Kommandozeilen-Hasen nicht kennen.

Wenn Sie mit Vim noch gar nicht vertraut sind, empfehle ich Ihnen als Einstieg das Kommando vimtutor. Es startet das Tutorial für Vim direkt von der Shell aus. All die guten Tipps und mysteriösen Einstellungen, über die man in Onlineforen stolpert, entstammen letztendlich der Vim-Dokumentation. Möchten Sie also wirklich zuverlässige, von den Entwicklern selbst geschriebene Anleitung, kann ich Ihnen die integrierte Hilfe nur ans Herz legen.

Wie in Vim üblich, gibt es dafür mit :help ein eigenes Kommando, abgekürzt als :he oder :h. Abbildung 1 zeigt das Einstiegsbild der Hilfe sowie den obligatorischen Hinweis, dass sich der Editor per [Umschalt]+[.]+[Q][Eingabe] (:q<Enter>) beenden lässt – immerhin soll sich schon der ein oder andere Nutzer mit der schier unlösbaren Aufgabe konfrontiert gesehen haben, Vim erfolgreich wieder zu verlassen.

Abbildung 1: Die Einstiegsseite von Vim gibt gute Tipps.

Abbildung 1: Die Einstiegsseite von Vim gibt gute Tipps.

Von den aufgelisteten Shortcuts möchte ich direkt [Strg]+[AltGr]+[ 9] und [Strg]+[O] (CTRL-] und CTRL-o) hervorheben. Beide Tastenkombinationen erweisen sich bei der Navigation in der Vim-Hilfe als nahezu unverzichtbar. Die erste springt, sofern Sie sich auf einem Tag befinden, zu dessen Definition. Ein solches Tag definiert der Inhalt zwischen zwei Pipe-Zeichen (|), beispielsweise |quickref|. Mit der zweiten, [Strg]+[O], springen Sie zurück zum Ausgangspunkt.

Der Vollständigkeit halber möchte ich noch [Strg]+[I] ( CTRL-i) erwähnen, das in der Jump-List wieder vorwärtsspringt, also das Gegenstück zu [Strg]+[O] bildet. Die Sprungliste beschränkt sich mitnichten auf die Vim-Hilfe. Tatsächlich steckt dahinter ein mächtiges Hilfsmittel, um durch Code zu navigieren – doch dazu später mehr.

Bewegung

Einer der am häufigsten unterschätzten Vim-Skills ist meiner Ansicht nach das Thema Motion. Während Nutzer und Nutzerinnen klassischer Editoren den Cursor per Pfeiltasten, Maus oder über irgendwelche obskuren Shortcuts bewegen, verfügt Vim hier über ganz eigene Möglichkeiten. Freilich kommen Sie auch ganz stupide per Pfeiltasten vorwärts, aber es lohnt sich wirklich, sich mit der durchaus überschaubaren Zahl elementarer und fortschrittlicher Kommandos zu befassen. Der wichtigste Merksatz lautet bei Vim stets: Wenn Sie Tastendrücke leicht vermeiden können, dann sollten Sie das auch tun. Dahinter verbirgt sich die Fähigkeit des Editors, eine Aktion zu wiederholen, wenn Sie eine Zahl voranstellen.

Statt zum Beispiel zehn Mal [J] (j) zu drücken, um zehn Zeilen tiefer ans Ende eines Absatzes zu kommen, klappt das bequemer mit [1]+[ 0]+[J] (10j). Es geht sogar noch eleganter, nämlich mittels [AltGr]+[Strg]+[ 0] (}). Die schließende geschweifte Klammer wechselt immer ans Ende eines Absatzes, in Programmiersprachen auch ans Ende einer Funktion und so weiter. Logischerweise führt ihr Gegenstück an den Absatzanfang.

Neben den geschweiften besitzen auch die runden Klammern eine überaus nützliche Bedeutung. Mit der öffnenden Klammer geht es zurück zum Anfang des aktuellen Satzes, mit der schließenden an dessen Ende. Auch hier erlaubt Vim einen Quantor: Gebe ich [4][Umschalt]+[ 8] (4() ein, finde ich die Schreibmarke tatsächlich vier Sätze weiter oberhalb im Text wieder.

Hab dich!

Die Suchfunktion lösen Sie in Vim über [Umschalt]+[ 7] (/) vorwärts und per [Umschalt]+[ 6] (?) rückwärts aus. Zur nächsten Fundstelle springen Sie mittels [N] (n), zur vorherigen über [Umschalt]+[N] (N).

Einen ähnlichen Effekt erzielen Sie, indem Sie die Schreibmarke auf einem relevanten Wort platzieren und anschließend [Umschalt]+[+] (*) beziehungsweise [#] drücken. Die beiden Tasten bringen Sie an das folgende beziehungsweise vorherige Vorkommen des Worts unter der Schreibmarke. An dieser Stelle möchte ich nochmals auf die Sprungliste hinweisen. Bewegungen über die Suchfunktion sowie einige andere Bewegungsfunktionen werden in der Sprungliste registriert und stehen Ihnen für die Navigation per CTRL-o beziehungsweise CTRL-i zur Verfügung.

Möchten Sie bestimmte Stellen im Text mit Lesezeichen versehen, greifen Sie auf 52 benannte Sprungmarken zurück, nämlich a bis z und A bis Z. Eine Sprungmarke setzen Sie, indem Sie auf der gewünschten Position im Text m eingeben, gefolgt von einem Ihnen genehmen Buchstaben, zum Beispiel mb oder mL. Der Sprung zurück gelingt über einen Backtick ', gefolgt vom gewählten Buchstaben. So bringt Sie 'b an die Marke b und 'L an die Marke L zurück. Bitte beachten Sie, dass der Backtick üblicherweise ein sogenannter Dead-Key ist, also erst nach einem weiteren Tastendruck auslöst und unter Umständen das Betätigen der Leertaste erfordert.

Eine Übersicht über die gesetzten Marken gibt das Kommando :marks aus. Unnötige Marken löschen Sie per :delm, gefolgt vom jeweiligen Buchstaben, beispielsweise :delm b. Marken mit Kleinbuchstaben gelten ausschließlich in der aktuellen Datei, während Großbuchstaben dateiübergreifend funktionieren, was sich zum Programmieren als überaus nützlich erweist. Numerische Marken (0 bis 9) unterscheiden sich von den anderen. Sie lassen sich nicht manuell setzen, und es gibt sie lediglich dann, wenn eine Datei viminfo existiert. '0 wechselt zurück zur letzten Position der letzten Änderung in der zuletzt bearbeiteten Datei. '1 erledigt dasselbe für die Datei davor, '2 für wiederum eine Datei davor und so weiter.

Um einfach nur zwischen der letzten und der aktuellen Sprungstelle zu wechseln, genügt es, zweimal den Backtick einzugeben (''). Spielt die exakte Position der Sprungmarke keine Rolle, sondern genügt die Zeile, können Sie statt des Backticks einfach das Akzentzeichen ' verwenden. Geben Sie zum Beispiel 'b ein, befindet sich Ihr Cursor am Zeilenanfang, im Fall von 'b auf der exakten Markenposition von b.

Oft möchte ich gar keine großen Sprünge machen, sondern bloß innerhalb einer Zeile zu einem bestimmten Punkt kommen, etwa zwei Wörter vorwärts. Das funktioniert in Vim extrem einfach mit [2]+[W] (2w). Soll die Schreibmarke nicht am Anfang des nächsten Worts stehen, sondern am Ende des vorherigen, klappt das mit [2]+[E] (2e). Rückwärts gelingt das ebenso simpel per [2]+[B] (2b).

Noch typischer als Sprünge um soundsoviele Wörter ist es, den Cursor zu einem ganz bestimmten Zeichen innerhalb einer Zeile zu teleportieren. Dazu kommen [F] und [Umschalt]+[F] (f und F) zum Einsatz. Dabei bewegt [F]+[Umschalt][ 0] (f=) ihn in der Zeile vorwärts zum nächsten =, [Umschalt]+[F][Umschalt]+[ 0] (F=) bringt ihn rückwärts zum vorherigen = in der aktuellen Zeile.

Wie Sie sich vielleicht schon denken, ist hier längst nicht Schluss mit der fortgeschrittenen Navigation im Text. Gerade in Office-Programmen fällt mir immer wieder auf, dass ich nach meiner letzten Editierposition suche. Dabei scrolle ich hin und her, lege unzählige Kilometer mit der Maus zurück und nutze mitunter Undo oder Redo, um zur gewünschten Änderung zu gelangen. Vim wartet erneut mit einem angenehm kurzen und zielführenden Shortcut auf: [G][Umschalt]+[,] (g;). Er bringt Sie nicht nur an die letzte Editierposition, sondern auch zu all ihren Vorgängerinnen, je nachdem, wie oft Sie das Kürzel eingegeben. Dabei spielt [Esc] eine große Rolle, beendet es doch den Insert-Modus und sorgt für die Pflege der entsprechenden Sprungliste. Sie gelangen bei diesen Sprüngen wieder zurück zum Ausgangspunkt, indem sie wie gewohnt CTRL-o drücken.

Irgendwo im Nirgendwo

Überlange Zeilen geraten in vielen Editoren zum ausgesprochen lästigen Problem. Befinde ich mich in einer solchen Zeile mit 200 oder mehr Zeichen, lande ich, wenn ich [Pfeil-unten] drücke, nicht intuitiv eine Zeile weiter unten auf dem Bildschirm, sondern irgendwo im Nirgendwo unter der überlangen Zeile. Solche Zeilen, die visuell umbrechen müssten, sollte man am besten vermeiden, indem man den Text bei Zeichen 80 (historisch bedingt) umbricht. Ungeachtet dessen stellt Vim einmal mehr ein gutes Hilfsmittel bereit.

Per [G]+[K] (gk) gelangen Sie in visuell nicht umbrochenen (“wrapped”) Zeilen eine Bildschirmzeile nach oben, per [G]+[L] (gl) nach unten – analog zu [K]+ (k) beziehungsweise [L]+ (l). Damit aber nicht genug: Passend zu den altbekannten Sprungmarken [^] und [Umschalt]+[ 4] ($), die den Cursor an den Anfang respektive das Ende einer Zeile bewegen, bringt Sie [G]+[ 0] (g0) in überlangen Zeilen an den Anfang der Bildschirmzeile und [G][Umschalt]+[ 4] (g$) an deren Ende. g0 und g$ habe ich nach über 20 Jahren mit meinem Lieblingseditor erst kürzlich entdeckt. Ich beginne so langsam, derartige Funde wie Easter Eggs in Computerspielen zu betrachten.

Die Funktion von * und # habe ich bereits erläutert. Wesentlich weniger bekannt ist, dass sich die beiden für Teile von Wörtern nutzen lassen. Dazu müssen Sie jeweils ein g voranstellen: Die Eingabe [G][Umschalt]+[+] (g*) auf dem Wörtchen “den” findet auch “verschieden”, da “den” ein Teil-String davon ist. Analoges gilt für [G]+[#] (g#). Weitere Informationen zum Thema Cursor-Bewegung finden Sie in der Vim-Hilfe unter :he motion.

Register

Kürzlich hörte ich einen Kollegen jubeln, er hätte endlich ein passendes Tool gefunden, das ihm mehrere Zwischenablagen ermögliche. Als Vim-Nutzer musste ich darüber schmunzeln, verfügt mein Lieblingseditor doch von Haus aus über 26 benannte Register (a bis z beziehungsweise A bis Z), die ich beliebig mit Text befüllen kann.

Beginnen wir aber zunächst mit dem unbenannten Register, da es einen besonderen Status aufweist. So landet beispielsweise jeder gelöschte sowie jeder geänderte Text darin. Das kann ungemein praktisch sein, zum Beispiel wenn Sie merken, dass eine Zeile an eine andere Stelle in der Datei gehört. Es genügt, sie per [D]+[D] (dd) komplett auszuschneiden und an passender Stelle wieder mit [P] (p) einzufügen.

Das Speichern in ein Register heißt in der Vim-Welt Yanking. Es funktioniert bis auf eine Ausnahme mittels "Buchstabey, das Einfügen oder Pasting via "Buchstabep. Um nun analog zu [Strg]+[C] und [Strg]+[V] von oder nach Vim zu kopieren, bedarf es des Quotestar-Registers [Umschalt]+[ 2][Umschalt]+[+] ("*). Ich kann also von Vim in die Zwischenablage per "*y kopieren und umgekehrt von der Zwischenablage nach Vim per "*p einfügen.

Die nummerierten Register verhalten sich hier anders. Register 0 enthält stets den Inhalt des letzten Yank-Kommandos. Die Register 1 bis 9 agieren wie ein Fifo-Speicher für Lösch- oder Änderungskommandos. Immer dann, wenn man einen Textabschnitt per [D]+ (d) löscht oder per [C] (c) ändert, verschiebt das den Inhalt von Register 1 nach Register 2, den von Register 2 nach Register 3 und so weiter. Der vorherige Inhalt von Register 9 geht dabei logischerweise verloren.

Wenn Ihnen die Unterscheidung zwischen dem unbenannten Register, dem Quotestar- und dem Quoteplus-Register zu verwirrend ist, können Sie sie per Einstellung auch zusammenlegen. In der vimrc hinterlegen Sie dazu lediglich die Zeile set clipboard=unnamed,unnamedplus. Ab dem nächsten Neustart von Vim sollte Ihnen Copy & Paste im Zusammenhang mit externen Tools deutlich leichter fallen. Alles Wissenswerte zu Registern finden Sie in der Vim-Hilfe unter :he registers.

Textobjekte

Register sind überaus hilfreich und mächtig, nutzen jedoch ohne die entsprechende Textauswahl nicht viel. In herkömmlichen Editoren erfolgt sie ausschließlich über eine visuelle Markierung des Texts per Maus oder Tastatur. Vim beherrscht das ebenso. Der dabei verwendete Modus heißt Visual Mode und startet per [V] (v). Ab diesem Zeitpunkt markiert der Editor jeglichen Text bis zur Position der Schreibmarke. Das funktioniert nahezu identisch wie die altbekannte, gelernte Art und Weise.

Sobald ich mit der Auswahl fertig bin, stehen mehrere Befehle bereit. Dazu zählt etwa [Y]+ (y), das Text yankt, also ihn ins unbenannte Register übernimmt. [C]+ (c) dient zum Ändern von Text. Dabei wird die Auswahl gelöscht, und ich befinde mich im Eingabemodus. Zum Löschen verwende ich [D] (d) für “delete”. So weit, so gut; all das kann selbst Microsofts Notepad.

Vim geht bei der Auswahl von Text aber weit darüber hinaus. Der Editor stellt in seiner Grammatik eigene Zeichen für bestimmte Textobjekte zur Verfügung. Beispielsweise versteht er w als Wort, s als Satz und p als Absatz (“paragraph”). Hinzu kommen noch Strukturen aus Markup- und Programmiersprachen. So können Sie an entsprechender Stelle den Inhalt eines Klammernpaars (...) schlicht über die Klammer ( erkennen. Das klappt analog für ", ' und – gerade bei HTML oder XML überaus nützlich – t, das Tags beziehungsweise XML-Elemente erkennt.

Das Geheimnis dabei liegt in einer Art Grammatik. Haben Sie die einmal verstanden, ist sie so simpel wie genial. Vim möchte im Command-Modus Kommandos im Schema BefehlPräposition (optional) – Textobjekt erhalten. Das klingt komplizierter, als es tatsächlich ist. Bei den Befehlen steht das c für “change”, das d für “delete” und so weiter. Als Präpositionen gibt es i für exklusive und a für inklusive des Grenzzeichens. Ein Textobjekt entspricht einem Wort, einem Satz, einem Zitat und so weiter.

Konkret benutzen Sie das Kommando diw, um das Wort unter der Schreibmarke zu löschen, während dip den kompletten Absatz entfernt und dit den Inhalt des Tags unter dem Cursor. Weiter lässt cis den aktuellen Satz verschwinden und bleibt im Insert-Mode. Abbildung 2 verdeutlicht, wie Sie per vit den Inhalt eines Tags (exklusive der Tags) auswählen. In Abbildung 3 sehen Sie, wie vat denselben Inhalt zuzüglich der Tags visuell markiert.

Abbildung 2: Per <code>vit</code> l&auml;sst sich der Inhalt von Tags ausw&auml;hlen.

Abbildung 2: Per vit lässt sich der Inhalt von Tags auswählen.


Abbildung 3: Inhalt und umschlie&szlig;ende Tags w&auml;hlen Sie mithilfe von <code>vat</code> aus.

Abbildung 3: Inhalt und umschließende Tags wählen Sie mithilfe von vat aus.

Mit ya( yanken Sie den Inhalt eines Klammerpaars inklusive der Klammern, yi' erledigt dasselbe für den Text in einfachen Anführungszeichen exklusive ebenjener. Wer sich diese simple Grammatik einmal angewöhnt hat, wird sich nur noch selten die Mühe machen, Text zunächst zu markieren, um ihn dann auszuschneiden und andernorts einzufügen. Ein simples dip, gefolgt von einem passenden Sprung und von p schneidet den aktuellen Absatz aus, um ihn an seiner neuen Adresse einzufügen. Einfacher geht es nicht. Weitere Erkenntnisse zu Textobjekten liefert die Vim-Hilfe unter :he text-objects.

Fazit

Für alle, die einen spielerischen Ansatz bevorzugen, empfehle ich unbedingt das Browser-Spiel VIM Adventures [1]. Darin steuern Sie den Helden über Vim-Shortcuts durch eine Welt aus Rätseln und Labyrinthen. Erscheint Ihnen die integrierte Hilfe zu sperrig oder ungewohnt, finden Sie sie auch online und per Browser durchsuchbar [2].

Sobald Sie sich trauen, in Vim einzutauchen, können Sie jeden Tag neue, großartige Funktionen entdecken, ohne sich jemals mit Plugins zu beschäftigen. Auch für alte Hasen gibt es immer noch vieles zu entdecken. Die schiere Menge an Shortcuts mag auf den ersten Blick überbordend wirken, stellt sich aber schon nach kurzer Zeit als ebenso intuitiv heraus wie Fahrradfahren. Es ist die überwiegend hervorragend durchdachte, logische Konsistenz, die dafür sorgt, dass die erwähnten Kommandos eben nicht obskur und beliebig bleiben, sondern schnell in Fleisch und Blut übergehen. (csi)

Infos

  1. VIM Adventures: https://vim-adventures.com/

  2. Vim help.txt: https://vimhelp.org

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 11/2024 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben