Atom ausprobiert: Githubs konfigurierbarer Editor ist vielversprechend

Als Github im Juni 2014 Atom ankündigte , stöhnten viele Kommentatoren: Braucht die Welt wirklich noch einen Editor? Die Github-Macher jedenfalls sind davon überzeugt. Sublime Text(öffnet im neuen Fenster) und Textmate(öffnet im neuen Fenster) seien zwar komfortabel, aber zu wenig anpassbar. Emacs und Vi ließen sich hingegen extrem modifizieren, seien aber für Einsteiger eher wenig komfortabel.




Die Github-Macher wissen ziemlich genau, wie die Open-Source-Welt tickt, und machen bislang nicht viel falsch. Auch nicht bei Atom. Sie glauben, dass Projekte wie Vi und Emacs nur deshalb gut und dauerhaft funktionieren, weil sie einerseits offen sind und andererseits über eine große Community verfügen. Daher plant Github, sich für den Editor, der unter einer MIT-Lizenz steht, langfristig zu engagieren.
Das schließt nicht aus, dass Github irgendwann eine Enterprise-Variante des Editors anbieten wird. Doch zumindest für die aktuelle Version 1.0, die Ende Juni erschienen(öffnet im neuen Fenster) ist, ist davon nicht die Rede.
Atommodell
Mit Atom sollen Entwickler plattformübergreifende Desktop- und Web-Apps entwickeln. Die Software bringt dafür Grammatiken für verschiedene Programmiersprachen mit, von Javascript über Perl und Python bis hin zu C, C++ oder Java. Letztlich ist Atom eine spezialisierte Variante des Browsers Chromium, und die Fenster sind nichts anderes als lokal gerenderte Webseiten. Die darin angezeigten Inhalte dürfen auf die Node.js-API zugreifen.
Atom besteht aus einem überschaubaren Kern (Atom Core), die meisten anderen Komponenten liegen hingegen als Atom-Pakete vor, die der Atom Package Manager (APM) verwaltet. Der Kern und die Pakete laufen in einer Umgebung namens Electron(öffnet im neuen Fenster) , die vormals Atom Shell hieß. Diese kümmert sich um automatische Updates, bringt einen Windows-Installer mit, fertigt Crash Reports an und liefert Benachrichtigungen aus. Die Funktionen sind über Javascript-APIs erreichbar.
Der Einfachheit halber verwenden und empfehlen die Entwickler für die Arbeit mit Atom Coffeescript anstelle von Javascript sowie Less als Ersatz für CSS. Allerdings lässt sich der Editor auch mit Javascript und CSS erweitern.
Die Installation ist nicht ganz einfach
Die Installation erfordert unter Ubuntu 14.04 ein wenig Aufwand, was vor allem an der für Atom benötigten Node.js-Umgebung liegt. Es gibt zwar fertige Pakete(öffnet im neuen Fenster) , aber wer die Software selbst kompilieren möchte, muss zunächst die passenden Dateien installieren:
sudo apt-get install build-essential git libgnome-keyring-dev fakeroot gconf-service libnss3
Anschließend gilt es, die neueste Node.js-Version zu besorgen, die Nodesource.com(öffnet im neuen Fenster) betreut:
curl -sL https://deb.nodesource.com/setup | sudo bash -
Die Befehlsfolge lädt ein Setup-Skript für die aktuelle Node-Version auf den Rechner und führt es mit Root-Rechten aus. Vorsichtige Anwender setzen nach der Pipe den Befehl more , um das Skript vor dem Ausführen zu betrachten und zu überprüfen.
Das Kommando sudo apt-get install -y nodejs installiert schließlich die neueste Variante des Frameworks – sofern es ohne Ärger durchgelaufen ist.
Wo ist Node.js?
Zeigt der Befehl which node jedoch anschließend kein Ergebnis, liegt das wahrscheinlich daran, dass die Binärdatei im Verzeichnis /usr/bin/ nodejs heißt. Atom sucht standardmäßig aber nach /usr/bin/node. Korrigiert wird das mit folgendem Befehl:
sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
Die nächste Befehlsfolge klont das Atom-Repository von Github.com und checkt dann – aus dem Verzeichnis atom heraus – die letzte stabile Veröffentlichung von Atom.
git clone https://github.com/atom/atom
cd atom
git fetch -p
git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
Schließlich muss das Build-Skript mit Admin-Rechten ausgeführt und dann der Javascript Task Runner Grunt(öffnet im neuen Fenster) gestartet werden, um die ausführbare Datei atom und den Paketmanager apm im Ordner /usr/local/bin zu installieren. Darüber hinaus lässt sich mit Grunt über script/grunt mkdeb auch ein Debian-Paket erzeugen.
Einfach strukturierte Oberfläche mit Schwächen
Nach der Installation, die etwas weniger aufwendig sein könnte, landen Entwickler auf einer grafischen Oberfläche. Sie besteht aus verschiedenen Bereichen, die als Panes bezeichnet und flexibel vergrößert und verkleinert, auf Wunsch auch neu anordnet werden können. Eine einzelne Datei, an der gerade gearbeitet wird, heißt im Atom-Jargon Buffer.
Im linken Bereich befindet sich der Verzeichnisbaum für das aktuelle Projekt, in dem großen Feld in der Mitte steht der Code. Über F11 wird der Vollbildmodus aktiviert, die Einstellungen öffnet Atom als zusätzlichen Reiter. Dazu können Anwender die Tastenkombination Strg+, benutzen oder schlicht über das Menu Edit | Preferences aufrufen.




Als Hilfe, insbesondere für Einsteiger, lassen sich sämtliche verfügbaren Befehle des Editors über das Kürzel Strg+Shift+P anzeigen. In der Web-Dokumentation gibt es auch ein hilfreiches sogenanntes Flight Manual(öffnet im neuen Fenster) , das bislang aber nur auf Englisch vorliegt.
Im Reaktor
Obwohl der Editor noch ein recht junges Projekt ist, bringt er bereits einige hilfreiche Funktionen mit. Eine oder mehrere Codezeilen lassen sich bequem nach rechts einrücken, indem der Code markiert und die Tab-Taste gedrückt wird. Über Shift+Tab wandert der Codeblock nach links.
Auch eine Autovervollständigung ist implementiert, hier versprechen die Entwickler künftig noch mehr Fähigkeiten. Aktuell lässt sie sich über Strg+Space aktivieren und zeigt Alternativen zu dem Element an, über dem sich der Mauszeiger im Augenblick befindet.
In den Editor-Einstellungen kann ein Soft Wrap per Häkchen aktiviert werden, dabei wechselt der Editor am Bildschirmrand die Zeile. Ein weiteres Häkchen bei Soft Wrap At Preferred Line Length bricht den Code nach n Zeichen um. Eine sichtbare Linie markiert dann die Umbruchgrenze, die im Standard bei den typischen 80 Zeichen liegt. Geändert wird dies in der Zeile Preferred Line Length. Mit der Option Soft Tabs, wandelt der Editor Tabs automatisch in Leerzeichen um, deren Anzahl sich ebenfalls in den Optionen festlegen lässt.
Um die Struktur von Code besser sichtbar zu machen, indem er unterhalb einer Methode, Anweisung oder Funktion einklappt, kann Folding genutzt werden. Bei Atom ließe sich das aber besser lösen, denn die kleinen Dreiecke links neben den Faltstellen sind mitunter schwer zu treffen und der Editor springt dann plötzlich in andere Codepassagen.
Schwächen und Stärken
Das junge Werkzeug weist auch noch ein paar Mankos auf. Das Auffälligste: Atom verschluckt sich an Dateien, die 2 MByte überschreiten, die Entwickler arbeiten an einer Lösung. Permanent feilen sie auch daran, den eher gemächlichen Start des Editors und die Reaktionsgeschwindigkeit des GUI zu beschleunigen. Es reagierte im Test einen Tick zu träge, was aber möglicherweise an der sie umgebenden virtuellen Maschine lag.
Besser klappt hingegen – wen wundert's? – die integrierte Versionsverwaltung mit Git und Github. So stellt Strg+Alt+Z die letzte gute Version einer Datei wieder her, das Kommando dazu entspricht:
git checkout HEAD -- /Pfad
git reset HEAD -- /Pfad
Möchte ein Entwickler zum Beispiel wissen, welche seiner Dateien Git nicht verfolgt, geschieht das mittels Strg+Shift+B, was einem git status gleichkommt. Mit Hilfe des Pakets language-git können die Commit-, Merge- und Rebase-Messages für Git optisch hervorgehoben werden. Über das Paket git-diff erhält der Editor die Fähigkeit, veränderte Zeilen visuell zu betonen.
Bei der Suche auf Github nach Informationen zu einer Datei, die aktuell bearbeitet wird, helfen ebenfalls eine Reihe von Tastaturkürzeln, die die folgende Tabelle auflistet:
| Kürzel | Aktion |
|---|---|
| Alt+G+O | Datei auf Github öffnen |
| Alt+G+B | Github-Infos zu den letzten Änderungen für eine Datei anzeigen |
| Alt+G+H | Github-Historie einer Datei betrachten |
| Alt+G+C | Github-URL der aktuellen Datei kopieren |
| Alt+G+R | Branch-Vergleich mit Github |
Hackbar bis zum Kern und Fazit
Ein weiteres Plus von Atom ist die Möglichkeit, die Software weitgehend zu modifizieren. Ein Package Generator erzeugt dafür ein Skeleton für ein Paket, das im Test klassischerweise hello-world heißen soll. Das Paket tut nichts weiter, als ein Fenster mit der "Hallo-Welt" -Nachricht anzuzeigen.
Über Strg+Shift+P wird dann die Befehlssuche gestartet, um Package Generator: Generate Package aufzurufen. Der dabei erzeugte Boilerplate-Code landet im Verzeichnis github/Projektname, wobei der Projektname im Beispiel hello-world lautet. Zugleich erscheint der erzeugte Baum von Verzeichnissen in der Ansicht links.




Die darin sichtbare vorletzte Datei heißt package.json . Sie enthält verschiedene Meta-Informationen zum Paket, darunter den Namen, die Versionsnummer, das potenzielle Github-Repository, aber auch den Pfad zu den ausführbaren Dateien im Unterverzeichnis lib .
Dieses Unterverzeichnis enthält gleich zwei Dateien: hello-world.coffee und hello-world-view.coffee . Während Letztere die Elemente für die grafische Oberfläche arrangiert, enthält erstere den Code mit der Logik für das Paket. Die Methoden activate, deactivate, serialize und toggle sind per Folding gekürzt, die Struktur des Codes wird im Folgenden sichtbar.
lib/hello-world.coffee
[...] activate: (state) -> @helloWorldView = new HelloWorldView (state.helloWorldViewState) @modalPanel = atom.workspace.addModalPanel( item: @helloWorldView.getElement(), visible: false) # Atom-Events lassen sich über CompositeDisposable einfach aufräumen @subscriptions = new CompositeDisposable # @toggle()-Methode mit 'hello-world:toggle' verknüpfen @subscriptions.add atom.commands.add 'atom-workspace', 'hello-world:toggle': => @toggle() deactivate: -> @modalPanel.destroy() @subscriptions.dispose() @helloWorldView.destroy() serialize: -> helloWorldViewState: @helloWorldView.serialize() toggle: -> console.log 'HelloWorld was toggled!' if @modalPanel.isVisible() @modalPanel.hide() else @modalPanel.show()Die ersten drei der vier Methoden in hello-world.coffee gehören in der Regel fest zu einem Paket. Die activate()-Methode erzeugt ein modales UI-Element ( ModalPanel ) und pinnt es an Atoms Arbeitsfläche. Die subscriptions()-Methode ordnet den später definierten Menü-Eintrag der Methode @toggle() zu, die optional für ein Paket ist. Sie sorgt dafür, dass unter dem Menüpunkt Packages ein Eintrag für hello-world auftaucht. Wer in dessen Submenü auf Toggle klickt oder Alt+Strg+O drückt, sieht das entsprechende Fenster auftauchen oder verschwinden.
Die Details im Menü sind anpassbar, was das nachfolgende simple Schema zeigt. Es findet sich im Ordner menus in der Datei hello-world.cson und erzeugt einen Eintrag für das Kontextmenü und für das Atom-Menü.
menus/hello-world.cson
'context-menu': 'atom-text-editor': [ { 'label': 'Toggle hello-world' 'command': 'hello-world:toggle' } ] 'menu': [ { 'label': 'Packages' 'submenu': [ 'label': 'hello-world' 'submenu': [ { 'label': 'Toggle' 'command': 'hello-world:toggle' } ] ] } ]Der nächste Codeblock erzeugt das Root-Element ( @element ) und ordnet diesem das Nachrichten-Element message als Child zu. Darunter legt der Code fest, wie das Element auf getElement()- und destroy()-Aufrufe reagiert.
lib/hello-world-view.coffee
module.exports = class HelloWorldView constructor: (serializedState) -> # Root-Element erzeugen @element = document.createElement('div') @element.classList.add('hello-world') # Nachrichten-Element erzeugen message = document.createElement('div') message.textContent = "Hallo Welt!" message.classList.add('message') @element.appendChild(message) # Gibt ein Objekt zurück, wenn der Nutzer das Paket aktiviert serialize: -> # Element entfernen destroy: -> @element.remove() getElement: -> @elementZusätzlich zu den gezeigten Optionen lässt sich noch der Stil in einer Less-Datei ändern (unter styles ), ein Tastaturkürzel festlegen ( keymaps ) und Spezifikationen für Tests erstellen ( spec ). Mit den Specs lassen sich Funktionen gegen Regressionen testen(öffnet im neuen Fenster) , die Atom-Macher setzen dafür auf das hauseigene Javascript-Test-Framework Jasmine(öffnet im neuen Fenster) .
Fazit
Für eine Version 1.0 macht Atom bereits einen soliden Eindruck und ist tatsächlich einfach und tiefgehend konfigurierbar. Nutzern des Editors Sublime Text dürften viele Elemente bekannt vorkommen, offenbar haben sich die Entwickler kräftig bei der proprietären Python-Software bedient. Sicherlich versprechen sich die Macher dank der guten Github-Anbindung des Editors auch eine neue und dauerhafte Nutzerbasis für ihre Codeplattform.
Doch braucht auch Atom ein wenig Einarbeitungszeit. Defizite hat der Editor noch bei der Reaktionszeit des Use Interface und im Umgang mit großen Dateien. Auch die Installation zeigt sich etwas hakelig. Dafür hat Atom schon nach einem Jahr eine sehr aktive Community und wurde bereits 750.000-mal heruntergeladen. Die 803 Entwickler haben 1.861 Pakete ergänzt, offenbar trifft der Editor einen Bedarf.
Dieser Artikel erschien in der Ausgabe 07/15 des Linux Magazins(öffnet im neuen Fenster) , das seit September 2014 wie Golem.de zum Verlag Computec Media gehört. In dem Heft werden unter anderem verschiedene Verwendungsmöglichkeiten für LDAP beschrieben und die Insolvenzfestigkeit von Open Source Lizenzen in Deutschland geprüft.



