Spacemacs

Bildnachweis: https://stocksnap.io/photo/PHOFG380TU

Ich mag Vim. Erwähnte ich schon ein paar mal. Bis ca. Juli 2017 habe ich alles in Vim gemacht. Dann kam irgendwann der Tag an dem ich Spacemacs probierte. Und diese kurze Probephase hat mich schnell dazu gebracht Vim mehr oder weniger hinter mich zu lassen und komplett auf Spacemacs zu setzen. 1

Spacemacs in Action - Screenshot von spacemacs.org

Spacewhat?

Vim ist ein toller Editor. Er ist vielseitig und erweiterbar. Wenn man allerdings irgendwann in eine Situation kommt ein Projekt mit großer Codebasis zu bearbeiten und zu refactoren, kann man mit Vim schnell an Grenzen stoßen. Zwar lässt sich mithilfe diverser Plugins ein Gefühl einer IDE erstellen, wirkt aber auf Dauer eher wie ein Flickenwerk als eine "Integrated Development Enviroment".
In meinen Fall war es ein großes Shopprojekt mit recht vielen Abhängigkeiten und diversen Frameworks und Konfigurationsebenen. Mit Vim bin ich irgendwann schnell an die Grenzen des machbaren gestoßen und was neues musste her. Da mein Muscle Memory inzwischen aber keine anderen Keybindings ausser VI zulässt und die meisten IDE Vi Emulationen eher dürftig sind, nutzte ich die Chance und installierte mir Spacemacs und nach einer überraschend kurzer Einarbeitungszeit habe ich nicht mehr zurück geschaut.

Spacemacs ist eine vorkonfigurierte Emacs Distribution, die die Vorteile von Vim und Emacs in einem Editor vereinigt. Möglich macht dies vorallem durch zwei Dinge:

Putting the SPC in Spacemacs
Spacemacs ist rund um die Spacetaste SPC aufgebaut. Drückt man diese wird in einem Popup an unterem Bildschirmrand ein Menü mit weiteren Auswahlmöglichkeiten angezeigt. Von hier aus kann man alle Unterfunktionen von Spacemacs öffnen. Beispiele:

  • Datei öffnen: SPC f f => f für files, f für find-file
  • Datei speichern: SPC f s => f für files, s für save
  • Git Status: SPC g s=> g für Git, s für Status

Das hört sich auf dem ersten Blick recht umständlich an, hat man die Grundbefehle aber erst in Fleisch und Blut (aka. Muscle Memory) ist es durchaus logisch und geht schnell von der Hand. Und dank Evil-Mode kann man auch einfach die bekannten Vim-Shortcuts nutzen.

Spacemacs Menu in der unteren Bildschirmhälfte - Screenshot von Spacemacs.org

Evil-Mode
Ein berühmtes, vielleicht ganz ernst gemeintes, Zitat aus den sogenannten "Editor War" ist: Emacs - a great operating system, lacking only a decent editor. Der Evil-Mode setzt genau hier an2.
Evil - eine Abkürzung für extensible vi layer - ist eine der ausgereiftesten VI Emulatoren und steht dem Original in seiner Grundfunktionalität in nichts nach.
Kurz: Was in Vim geht, geht auch in Evil.

Evil-Mode ist das Herzstück von Spacemacs. Im Wesentlichen ist Spacemacs sogar um Evil-Mode herumgebaut worden. Und der Grund warum auch ich so von Spacemacs überzeugt bin.

Dieses Video von Aaron Bieber gibt einen guten Überblick zu Evil-Mode.

Spacemacs ist nicht Emacs, Spacemacs ist Spacemacs

Ich arbeite jetzt seit 8 Monaten exklusiv in Spacemacs, aber meine Berührungspunkte mit Emacs sind immer noch sehr gering. In der Tat ist Emacs für mich immer noch ein Buch mit sieben Siegeln unbenutzbar zu komplex. Es scheint als wäre alles was man über Emacs und seine langen Shortcut Ketten sagt ... wahr.

Wer erhofft mithilfe von Spacemacs auch Emacs zu lernen, wird enttäuscht sein. Spacemacs nutzt zwar Emacs als Unterbau, macht es dem Nutzer aber leicht dieses komplett zu ignorieren. Wer Evil-Mode nutzen will, aber auch Emacs besser kennenlernen möchte, dem ist eine Emacs Installation mit einer eigenen Konfiguration mehr empfohlen.

Es ist einfacher Spacemacs als ein komplett eigenständiges Produkt zu sehen.

Von Vim zu Spacemacs

Hier nur ein kleiner Abriss, die offizielle Dokumentation hat einen sehr guten und umfangreichen Artikel. Aber kurz zusammengefasst:

States
Aus Vim kennt man bereits Modi wie Insert, Visual oder Normal. Diese findet man auch in Spacemacs, allerdings heissen es hier States. Ein Beispiel: Der Vim Insert Mode heisst in Spacemacs evil-insert-state.

Mayor- & Minor-Mode
Modi gibt es aber auch, sind aber durch Emacs bereits mit einer anderen Definition behaftet. Hier wird zwischen Major- und Minor Mode unterschieden.

  • Major Modes bestimmt das generelle Verhalten in einem Buffer. Diese sind für größere Aufgaben gedacht und meist auf einen Dateityp zugeschnitten. Major Modes aus meinen täglichen Repertoire sind z.B. der PHP Mode, Web-Mode, Text Mode oder YAML Mode. Der Mayor-Mode wird automatisch nach Dateityp ausgewählt, kann aber jederzeit geändert werden. Es kann immer nur ein Major Mode aktiviert sein.
  • Minor Modes sind kleinere Funktionen. die für jeden Buffer zusätzlich aktiviert werden können. Das können kleine Erweiterungen wie Editorconfig oder Smartparens sein, aber auch komplexerer Pakete wie der Company-Mode. Es können mehrere Minor-Modes gleichzeitig aktiv sein.

Transient States
Transient (deutsch: vorübergehend) States sind temporäre States in Spacemacs die wiederholende Kommandos vermeiden sollen. Es muss also nicht immer wieder ein Befehl mit SPC gestartet werden, sondern es öffnet sich ein Popup am Bildschirmrand mit weiteren Optionen. Dieses kann mit q geschlossen werden.

Ein Transient State für Code-Folding

Und nun?

Erste Schritte
Out of the Box ist Spacemacs eigentlich direkt einsatzfähig. Man kann mit hjkl navigieren, i lässt einen direkt in den Insert Modus wechseln und ESC diesen auch wieder verlassen. Vim Befehle lassen sich auch wie gewohnt mit : starten.

Die einzelnen Pakete sind in Spacemacs in Konfigurationsebenen - auch Layer genannt - organisiert. Hier gibt es bereits einige zur Auswahl. Allerdings noch nicht aktiviert / installiert. Eine Liste mit allen Layern ist mit SPC h SPC in Spacemacs einsehbar.

Die Installation ist aber kein Problem, Spacemacs hat Lazy Loading an Bord. D.h. wenn beispielsweise ein PHP Dokument geöffnet wird, Spacemacs automatisch vorschlägt den PHP Layer zu installieren und zu aktivieren.

Weitere wichtige Bestandteile sind sicherlich Helm und Projectile. Helm ist - einfach erklärt - ein horizontaler Splitview der Suchergebnisse, Bookmarks, Dateien oder Buffer anzeigen kann. Am einfachsten zu vergleichen mit dem FZF Plugin in Vim. Projectile hilft beim Arbeiten innerhalb von Projekten und erleichtert das Navigieren und Bearbeiten innerhalb eines Projektes. Projekte werden automatisch hinzugefügt, wenn beispielsweise eine Datei in einem Git Projekt bearbeitet wird. Mit SPC p p lässt sich dann einfach das ganze Projekt wechseln. SPC p t ruft eine NeoTree Ansicht des Projekts auf - optisch ähnlich zum NERDtree Plugin in Vim.

Deeper into the rabbit hole
Und wo wir schon bei Git sind - Spacemacs hat Magit an Bord. Ein Paket für das alleine schon der Wechsel auf Emacs / Spacemacs lohnt. Magit erlaubt es so ziemlich jede Git Operation in wenigen Tastenanschlägen auszuführen. Magit alleine verdient wahrscheinlich schon zwei bis drei eigene Artikel auf diesem Blog, darum versuche ich es erst garnicht und verweise erstmal auf die Projektwebseite bzw. die Spacemacs Dokumentation zu Magit.

Das **Magit-Popup**, aufrufbar mit `SPC g m`

Auch eine Shell ist vorhanden. Diese lässt sich mithilfe von SPC ' öffnen. Hier steht die Systemshell, aber auch die Emacs eigene Eshell zur Auswahl. Mehr zu den Unterschieden liest sich hier.

Konfiguration
Spacemacs wird in einer .spacemacs Datei angepasst und erweitert 3. Diese befindet sich meist im Homefolder (unter Windows in %appData% Ordner). Man kann sie aber auch direkt mit SPC f e d in Spacemacs öffnen. Sie ist gut kommentiert und an sich gut verständlich, trotzdem hier eine kurze Zusammenfassung der Stellen, die ich bearbeitet habe.

  • dotspacemacs-configuration-layers - Hier werden alle Zusatzpakete aufgelistet. Kann alternativ auch mit SPC h SPCoder per Lazy Loading gemacht werden.
  • dotspacemacs-additional-packages - Weitere Pakete die keinen Layer benötigen oder haben. Ich hab hier z.B. vue-mode, scss-mode und editorconfig eingeladen.
  • dotspacemacs-themes - recht selbsterklärend, Themes. Es können mehrere angegeben werden. Mit SPC T n kann durchgeschaltet werden.
  • dotspacemacs-default-font - Font Settings wie Schriftgröße oder Art. Ausserdem kann hier mit :powerline-scale noch die Größe der Statusleiste am unteren Bildschirmrand gesetzt werden.
  • defun dotspacemacs/user-config- User, Paket und Layer Konfigurationen die nicht mit einem der anderen Flags eingestellt werden können.

Ausführlicher 4 hat es Jonathan Soifer in seinem Medium Post beschrieben.

Org-Mode
Und dann ist da noch der Org-Mode. Ich habe mich insgesamt nur relativ wenig mit Org-Mode beschäftigt, sehe aber jetzt schon SEHR VIEL Potential. Richtig genutzt könnte ich alleine mit Org-Mode mehrere Teile meiner Toolchain komplett ersetzen.

  • Workflowy: Org-Mode ist wie Workflowy ein Werkzeug für Outlining. Bietet mir dazu aber die Möglichkeit aus Projekten heraus Notizen zu erstellen. Wer mehr über Workflowy wissen möchte, hier schrieb ich etwas darüber.
  • Todoist: Org-Mode ist eine sehr umfangreiche Todo Liste. Ich kann Termine einstellen, Deadline setzen und direkt aus Projekten und Dateien heraus Tasks erstellen.
  • Toggl: Meine aktuelle Timetracking Lösung. Org Mode kann auch dies. Hierbei ist es möglich Start und Endzeiten an Tasks zu setzen. Dies lässt sich dann für einen definierten Zeitraum ausgeben. Ausserdem gibt es noch viele Ansichten weitere Möglichkeiten. Vermutlich aber auch der komplexteste Bereich

Ein gemeinsamer Nenner hier: Org-Mode ist eigentlich jedem dieser Tools überlegen. Warum nutze ich jetzt also nicht bzw. kaum Org-Mode? Offensichtlich bin ich ja ziemlich begeistert.

  • Orgmode ist komplex. Sehr komplex. Ich müsste mir eine Vielzahl von Shortcuts merken und auch mein Verständnis von Emacs selbst stärken, da viele Funktionen und Operationen nur / besser direkt in Emacs zugänglich sind.
  • Im Gegensatz zu Org-Mode habe ich die oben aufgezählten Tools immer und überall zur Verfügung. Im Webbrowser, als App oder auf dem Smartphone. Zwar kann ich meine Org-Mode Datei in die Cloud schieben. Bearbeiten ist so aber eher mühsam.

Einen Überblick über Org-Mode gibt dieses Video von Harry Schwartz.

Spacemacs auf Windows und Linux

Spacemacs lässt sich sowohl in einer GUI oder auch direkt im Terminal nutzen. Funktional gibt es nur wenige Unterschiede zwischen GUI und Terminal. Wenn man also auf die Darstellung von Bildmedien und fehlenden Mouse Support verzichten kann, dem steht nichts im Wege auf die GUI zu verzichten.

Spacemacs GUI / Terminal im Vergleich auf Ubuntu 17.10

Initial habe ich Spacemacs auch auf Windows 10 genutzt. Das hat auch eine Weile ganz gut funktioniert, bin aber irgendwann auf Probleme mit einigen Paketen gestoßen5. Dazu kamen gelegentliche Freezes und dass das System nicht so responsiv auf Eingaben war, wie ich es mir gewünscht habe.

Inzwischen habe ich exklusiv für Spacemacs eine Ubuntu Installation im Dual Boot auf dem Dell XPS installiert 6. Und hier läuft alles so wie es sein sollte. Schnell, performant, responsiv. Falls sich also wer fragt was aus #florenzgoeswindows geworden ist, aktuell ist es in einem Hiatus.

Cheatsheet

Nachfolgend ein Gist mit gängigen Spacemacs Shortcuts. Beiweitem nicht vollständig, kann aber ggf. den Einstieg erleichtern.

Links

  1. Ich nutze immer noch gelegentlich VIM - wakatime screenshot

  2. Der Editor War sollte eher als Satire als ernstzunehmende Rivalität betrachtet werden. Software, wie vieles andere auch, ist kein Grund jemanden zu diskriminieren oder zu bevorzugen. Ausser nano Nutzer. Ihr seid selbst Schuld.

  3. Sollte man selber auf die Suche nach Paketen gehen, wird meist empfohlen diese in einer emacs.d oder init.el Datei zu initialisieren. Diese sollten in Spacemacs allerdings nicht angefasst werden. Ich wiederhole, es passiert alles in der der .spacemacs Datei, genauer in der dotspacemacs/user-config und dotspacemacs-additional-packages

  4. Und vermutlich auch besser

  5. Der PHP Mode will u.a. Ressourcen via wget installieren. Die lässt sich zwar umgehen indem man händisch das Zip installiert, ist aber keine dauerhafte Lösung, beim nächsten Update gibt es wieder das Problem.

  6. Dies war überraschend einfach. Habe mich größtenteils an diese Anleitung gehalten. Würde aber nicht empfehlen aktuell Ubuntu 17.10 zu installieren, da es mir nicht sehr Stabil erscheint. Entweder also Ubuntu 16.04 LTS installieren oder auf die nächste LTS Version im April (18.04) warten.