CLI-Adventskalender, Tag 24: vim. Frohe Weihnachten!

CLI-Adventsklender: vim

Avatar von Eric

Frohe Weihnachten! Cool, dass ihr so lange mit dabei geblieben seid!

Diejenigen unter euch die mich kennen haben sich sicher schon gefragt, wo dieser Artikel bleibt. Ich glaube es ist in den letzten Jahren kein Tag vergangen, an dem ich nicht Vim benutzt habe.

Vim. Oh Gott, warum?!

Vim ist überall. Für viele ist es der Editor, wenn man schnell über SSH mal was machen will. Nur wenige, spezielle Menschen benutzen Vim tatsächlich für die Softwareentwicklung. Es ist brilliant zu diesem Zweck, braucht aber etwas Übung.

Alles was ich in den letzten Wochen zur Kommandozeile gesagt habe, zählt doppelt für Vim.

Bash ist stark konfigurierbar … aber nicht so start wie Vim.

Plaintext ist der König? Vim ist der König darin, Plaintext zu bearbeiten. Quote me.

Unix-Werkzeuge sind kombinierbar? Vim kann ausgewählten Text gleich durch eine Unix-Pipe jagen und durch das Ergebnis ersetzen … ohne, dass ich Vim verlassen muss.

Automatisierung ist fest integriert? In Vim kann ich ein Makro live recorden und dann immer wieder ausführen.

Ok, ich nehme mal meinen Gebrauchtwagenhändlerschnauzbart wieder ab. Meine Empfehlung: Wenn das was ich gerade gesagt habe nicht reicht, schaut euch ein paar Demos auf YouTube an. Wenn euch die Kommandozeile taugt, wird euch Vim taugen! (Oder Emacs. Ich bin nicht sauer, wenn ihr Emacs-User werdet, ich bin nur ein kleines bißchen enttäuscht.)

Werde nicht zu einem Meme

Um Vim zu starten: vim

Um Vim zu beenden: :q!

Das ist jetzt nicht, sagen wir mal, das Erste was man ausprobiert, wenn man ein Programm beenden möchte.

  • : öffnet den Command-Mode, der eine Reihe von mächtigen Befehlen anbietet
  • q ist die Kurzform von quit
  • ! ist allgemein das Zeichen für Gefahr oder „Mach es halt trotzdem“. Schließe das Programm, auch wenn es ungespeicherte Änderungen gibt.

Modales Arbeiten

Das wichtigste Konzept an Vim ist das Arbeiten mit modes. Wenn ich Text eingeben möchte, muss ich vorher (z. B.) mit i in den Insert Mode wechseln. Mit Escape komme ich dann wieder zurück in den Normal Mode. Das Kluge an diesem Konzept ist, dass ich jetzt alle Buchstabentasten verfügbar sind, um alle möglichen Dinge zu tun. Anstelle STRG+SHIFT+X oder so etwas zu drücken kann ich dd tippen und die aktuelle Zeile löschen. Anstelle von STRG+Z habe ich u für Undo.

hjkl

Technisch gesehen kann man Vim mit den Pfeiltasten bedienen. Man möchte nur nicht. Die Buchstaben h, j, k und l stehen für links, unten, oben und rechts. Sie liegen leicht erreichbar in der Mitte der Tastatur wo die Finger bei allen, die das 10-Finger-System gelernt haben, ohnehin ruhen.

Eine Menge von Programmen unterstützen „vim motions“, nicht nur auf der Kommandozeile. Ich kann mit hjkl genauso gut less steuern, wie zathura und meinen i3-Window-Manager. Und einen Haufen Programme mehr, bei denen es mir gar nicht mehr auffällt. Ich habe Vimium in meinem Firefox installiert und habe deshalb Vim-ähnliche Shortcuts. Eine Seite mit r zu refreshen, mit j oder STRG+D runterscrollen, mit gt in den nächsten Tab. All das fühlt sich nach einiger Zeit natürlich an.

Fang an, Dich zu bewegen

Jetzt lernen wir langsam laufen. Viele Dinge in Vim folgen einer Sprache, die sich nach einiger Zeit intuitiv anfühlt. Man kann Zeilen kopieren („yanken“) mit yy und pastieren mit p. 3yy yankt drei Zeilen (die aktuelle und die zwei drunter) und 2p pastiert sie zweimal.

Mit ciw könnt ihr einen „change in word“ machen, also das aktuelle Wort löschen und genau dort weitertippen. Um schneller voranzukommen, kann man auch mal fe tippen, um das nächste „e“ in der aktuellen Zeile zu finden. Fe macht das Gleiche, nur rückwärts. Mit / kriegt man die Volltextsuche und mit n springt man zum nächsten Treffer.

Jetzt kommt der Punkt

Eines der mächtigsten Features in Vim ist ., was die letzte Änderung nochmal ausführt.

Mit 

/OldClassName
ciw
NewClassName
<ESC>
n
.
n
.
n
.

Ja, ich weiß … das geht auch mit

:%s/OldClassName/NewClassName/gc
  • : Command Mode
  • % in der Ganzen Datei, nicht nur der aktuellen Teile
  • s/a/b/ ersetze OldClassName mit NewClassName
  • g für „global“, alle Vorkommnisse auf der Zeile, nicht nur das Erste
  • c für „Bitte frag mich jedes Mal vor dem Ersetzen“

Was den Punkt so mächtig macht, ist, dass er der perfekte Einstieg in den Vim-Workflow ist. Mit n zum nächsten Suchergebnis oder mit ; die letzte Suchbewegung (z. B. fe) nochmal ausführen, mit Punkt die letzte Änderung nochmal ausführen, ganz gleich wie komplex.

Was mich gleich zum nächsten Thema bringt.

Makro-Biome

Mit qq, wobei der zweite Buchstabe beliebig ist (qa, qb, qc, etc. – es sind alle valide), beginnt das Aufzeichnen eines Makros. Jede Bewegung und jeder Befehl danach wird gespeichert. Mit q stoppt man die Aufzeichnung und mit @ und dann dem Buchstaben, also z.B. @q wird das Makro ausgeführt. Auch hier kann eine Wiederholungsanzahl davor stehen 22@q ist ziemlich leicht zu tippen, auf der englischen Tastatur.

Warum gehe ich hier so ins Detail? Weil Vim repetitive Textarbeit damit von Stunden auf Minuten reduziert. Anstelle von vorsichtig geschmiedeten regulären Ausdrücken kann ich hier live sehen was ich tue. Alle Anweisungen sind meine regulären Vim-Bewegungen: hjkl, fe, ciw, Escape, und so weiter.

Mehr noch: Hinter den Buchstaben verstecken sich Vim-Register, die nichts anderes sind als Zwischenablagen. Mit "qp kann ich den Inhalt des Registers ausgeben und bearbeiten. Und mehr noch: Ich kann diese Befehle gleich hinter einen permanenten Shortcut hinterlegen, um sie dann immer wieder auszuführen.

Der Übergang von „Hier ist eine Reihe von Befehlen“ zu „Ich nehme ein Makro auf“ zu „Ich hinterlege sie in meiner .vimrc“ zu „Ich lagere es aus in ein Plugin und packe es auf GitHub“ ist in Vim sehr, sehr fließend. 

Zu diesem Thema…

Deine .vimrc und Du

Die .vimrc eines Vim-Users ist oft das Herzstück jahrelangen Feintunings. Jeder Befehl der nützlich ist kann von dort mit einem Hotkey hinterlegt werden, sei es eine native Vim-Funktion oder ein Kommandozeilenbefehl.

Ein Blogartikel ist nicht das richtige Medium, um dieser Datei gerecht zu werden. Eine .vimrc ist das ultimative dotfile (siehe mein Artikel zu dotfiles), und sie von System zu System zu tragen ist eine gute Idee.

Ein Pro-Tipp aber auf jeden Fall hier: Die meisten Tasten sind bei Vim schon vergeben. Benutzerdefinierte Shortcuts beginnen deshalb häufig mit einem benutzerdefinierten „Leaderkey“, häufig der Leertaste. Mit <Leertaste>w öffne ich zum Beispiel einen datierten Notizzettel, einen „Worklog“. Sehr nützlich, um sich schnell was aufzuschreiben.

Buffer, keine Tabs

Wer mehrere Dateien gleichzeitig mit Vim öffnen möchte, läuft erst einmal vor eine Mauer. Obgleich Tabs in Vim existieren, sind Buffer mächtiger und daher gebräuchlicher.

:buffers

Mit :bn und :bp geht es vor und zurück. Mit :b 1 geht es gleich zum entsprechenden Buffer. Warum sind Buffer mächtig? Weil man z. B. mit :bufdo Operationen auf allen von ihnen ausführen kann. Weil man eigentlich keine visuelle Erinnerung an offene Dateien braucht, nur effiziente Wege, hin- und herzuspringen.

Das Navigieren von Buffern und Dateien lässt sich durch Plugins, z. B. durch fuzzy-searching ergänzen. Mehr dazu … jetzt sofort.

Plugins vom Papst

Ganz besonders im neovim-Umfeld (für Anfänger gibt es nur dann einen Grund neovim zu verwenden, wenn es dort ein Plugin gibt, das es nicht für Vim gibt) gibt es eine Reihe von Rundumsorglos-Plugins, die alles für Dich konfigurieren und Dir eine IDE-Erfahrung direkt aus der Tüte versprechen.

Das ist eine Falle.

Ja, ein paar dieser Plugins halten was sie versprechen, aber man benutzt immer noch jemand anderes Vim. Ich halte es um Welten besser mit der Vanilla-Erfahrung anzufangen und sich langsam vorzuarbeiten.

Wer sich nach Plugins umsehen möchte, dem empfehle ich, sich die Plugins von Tim Pope anzuschauen. Insbesondere halte ich fugitive für einen der besten Git-Clients ever (ich habe von Leuten gehört, die Vim benutzen, nur um fugitive zu verwenden) und unimpaired was einige Convenience-Shortcuts einfügt wie z. B. ]b für :bn und [b für :bp. Das Schöne an Tim Popes Plugins ist, dass sie sich nahtlos in die vorhandene „Vim-Sprache“ einfügen. Sie versuchen nicht, halbherzig Dinge in Schlechter auszuliefern, die Vim schon nativ kann, so wie viele andere Plugins es tun (Opinionated? Ich?).

Eine Frage der Tastatur

Ja, ich habe jeden dieser Artikel in Vim geschrieben. Ja, Vim zu benutzen macht mehr Spass mit einem englischen Layout. Ja, jedes Mal wenn ich einen Umlaut schreibe, nutze ich im Insert Mode

STRG+K
:u

was auch allgemein ein nützlicher Weg ist, um einen Haufen anderer Sonderzeichen zu schreiben (:help digraphs).

Ein schneller Shortcut, um Tastaturlayouts zu wechseln hilft. Capslock und Escape zu tauschen …

setxkbmap -option "caps:swapescape"

… hilft noch mehr. Ich habe mir für diesen Befehl einen Shortcut in meiner .vimrc definiert.

Wie lernt man das?

Den ersten Einstieg gibt es mit vimtutor, einem Lernprogramm, das mit Vim installiert ist und interaktiv alle Basiskonzepte vermittelt.

Ich kann auch Practical Vim von Drew Neil sehr empfehlen. Am besten mit

pdftotext practical_vim.pdf
vim practical_vim.txt

gleich in Vim aufmachen und die Codebeispiele live ausprobieren. (So habe ich Vim gelernt, ich kann es sehr empfehlen.)

Vim hat eine ausführliche Dokumentation, die – so die Weisheit des Internets – immer besser ist als man erwartet.

:help motion

Wer etwas Geld und Zeit über hat, findet vielleicht Freude an dem Spiel Vim Adventures, was versucht, die gängigsten Vim-Shortcuts auf spielerische Weise zu vermitteln.

… oder doch Emacs?

Lange bevor es Facebook oder Reddit oder Tumbler gab, gab es das Usenet, auf dem die ersten intensiven Flamewars stattfanden. Die Editoren Vim und Emacs haben grundsätzlich unterschiedliche Philosophien, aber abgesehen vom Comedy-Value („Emacs ist ein fantastisches Betriebssystem, dem nur ein guter Editor fehlt“) sehe ich absolut keinen Grund, nicht mal einen Blick zu riskieren. Es gibt eine Menge Menschen die sagen, dass org-mode – ein Emacs-Plugin – ihr Leben verändert hat.

Shell-Weisheit des Tages
Eins nach dem Anderen

Hui, das war eine Reise, hm?

Die ganze Zeit bin ich davon ausgegangen, dass diese Artikel von Leuten gelesen werden, die skeptisch sind, was die Kommandozeile angeht. Das meine ich nicht negativ. Wir alle haben Dinge zu tun und zu wenig Zeit für alles. Wir alle müssen erst den Wert hinter Dingen verstehen, bevor wir bereit sind, Arbeit in etwas zu stecken. Vielleicht aber, vielleicht geht es euch so wie mir: Ihr wollt alles. Und zwar jetzt sofort. Und es ist super frustrierend zu sehen, wie lange es dauert, das alles zu lernen. Oder es ist entmutigend, weil es so viel zu lernen gibt und man es einfach nicht meistern kann.

Eins nach dem anderen.

Ein super motivierender Aspekt der Kommandozeile ist, wie gut sie investierte Zeit belohnt. Fünf Minuten hier und da können einen merklichen Unterschied im täglichen Leben machen. Und wenn ihr schon wisst, dass ihr im vim (oder Emacs, ich bin total tolerant) zuhause sein wollt?

Eins nach dem anderen.

Auch wenn es weh tut. Klar, ihr könnt euch Anki-Karten bauen und Challenges auf diversen Plattformen grinden. Wenn ihr Dinge wirklich meistern wollt, bedeutet es aber, die Grundlagen immer und immer wieder zu trainieren, über einen längeren Zeitraum hinweg. „Die Anfängerin übt, bis sie es richtig macht. Die Meisterin übt, bis sie es nicht mehr falsch machen kann.“ Alles was im Muskelgedächtnis ist erfordert keine mentale Kapazität mehr und öffnet den Raum für Kreativität. Wenn ihr also einen Neujahrsvorsatz wählen wollt, warum nicht einer von diesen?

  • Ein Einmachglas auf den Schreibtisch stellen und jedes Mal eine Cent-Münze reinwerfen, wenn ihr etwas neues über die Kommandozeile gelernt habt (Fortschritt wird so schnell sichtbar)
  • Einem Meetup oder Slack-Channel mit Gleichgesinnten beitreten und regelmäßig über Konsole abnerden
  • Einen Kurs buchen
  • vim anstelle von nano als Standardeditor auf eurer Kommandozeile einstellen
  • Einen Block auf euren Tisch legen und jedes Mal wenn ihr auf der Kommandozeile irgendwo stolpert oder irgendwas hakt, einfach mal eine Notiz machen

Wie bei allen Neujahrsvorsätzen müsst ihr selber rausfinden, was für euch funktioniert. Bei mir ist es Habitica. (Ich bin ein Level 275 Mage.)

In diesem Sinne: Schöne Feiertage und einen guten Rutsch ins neue Jahr!

Avatar von Eric

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.