Org-Mode für unterwegs mit Orgzly & Syncthing

2018-10-26

Ich suchte schon länger nach einer geeigneten Lösung, wie ich Notizen, erstellt mit Emacs unter dem Org Mode, auch mobil lesen und pflegen kann. Bisher probierte ich z.B. MobileOrg mit der entsprechenden Android-App oder aber die App Orgzly in Kombination mit Nextcloud aus.

Doch erst das Zusammenspiel von Orgzly und syncthing hat mich als mobile Alternative überzeugt, insbesondere was eine flüssige und nahtlose Synchronisation angeht.

Syncthing für den Desktop

Syncthing ist offen, dezentral und kommuniziert verschlüsselt von Ende zu Ende. Es ist für die gängigen Betriebssysteme frei verfügbar. Unter einem aktuellen Debian/Ubuntu kann es direkt über den Package-Manager installiert werden:

apt install syncthing

Nach dem Aufruf syncthing kann die Einrichtung anhand einer Web-Oberfläche im Browser unter localhost:8384 vorgenommen werden. Hier können Verzeichnisse und Geräte für andere syncthing-Instanzen einfach angemeldet werden, was die Dokumentation bereits gut beschreibt. Unter dieser Web-Oberfläche kann somit das zu synchronisierende Org-Verzeichnis berücksichtigt werden, z.B. ~/Documents/org.

Es können dabei auch Dateien von der Synchronisation ausgeschlossen werden. Dies macht Sinn für die Archiv-Dateien des Org-Modes. Diese Dateien werden ausgenommen, wenn z.B. unter ~/Documents/org die Datei .stignore mit dem folgenden Inhalt angelegt wird:

*.org_archive

Bei permanenter Nutzung lohnt sich natürlich die Einrichtung eines Autostarts. Bei einem Desktop vorzugsweise als Daemon über einen Systemd User Service. Ist der Daemon eingerichtet, kann dieser beim Start der GNOME Shell aktiviert werden, indem unter dem Verzeichnis ~/.config/autostart z.B. eine Datei, wie synching-launcher.desktop, mit dem folgendem Inhalt hinterlegt wird:

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[de_DE]=gnome-panel-launcher
Exec=systemctl --user start syncthing.service
Name[de_DE]=syncthing launcher
Name=syncthing launcher
Icon=gnome-panel-launcher

Als zusätzliche Option gibt es noch eine schöne GNOME Shell Extension namens Syncthing Icon (alternativ via Ubuntu SW-Center installierbar), mit welcher sich der aktive Status von syncthing in der Statusleiste anzeigen und steuern lässt.

Syncthing & Orgzly für das Smartphone

Auf dem Smartphone werden 2 Apps benötigt. Syncthing für die Synchronisation und Orgzly für die eigentliche Bearbeitung der eigenen Org-Notizen, also quasi als mobile und abgespeckte Alternative gegenüber dem Org-Mode unter Emacs.

Syncthing-App

Syncthing ist als gleichnamige App für Android unter F-Droid oder unter GooglePlay verfügbar. Die Einrichtung der zu synchronisierenden Geräte und Verzeichnisse erfolgt analog dem Desktop. Nachdem mit der App die jeweiligen Schlüssel bzw. IDs von Desktop- und Smartphone-Instanzen gegenseitig bekannt gemacht und freigegeben wurden, kann man nun auf das vom Desktop freigegebene Org-Verzeichnis zugreifen.

Orgzly

Orgzly ist ebenfalls unter F-Droid und GooglePlay verfügbar. Unter Orgzly macht man nun das frisch synchronisierte Org-Verzeichnis bekannt mit: Einstellung->Synchronisieren->Ablageorte->Verzeichnis Das Verzeichnis findet man an einem Ort, welcher zum Beispiel, wie folgt, aussehen könnte: /storage/.../Android/data.com.nutomic.syncthingandroid/files/org

Tipp: Um das konkrete Org-Verzeichnis auf dem Smartphone ausfindig zu machen, kann man sich in der syncthing-App den physischen Ablageort des Verzeichnisses anzeigen lassen, indem man sich die Details des Verzeichnisses auflisten lässt.

Zudem habe ich gute Sync-Erfahrungen mit den (noch experimentellen!) Funktionen unter Einstellungen->Synchronisieren->Automatisch synchronisieren gemacht. Ich aktivierte hierzu die folgenden Funktionen:

  • Auto-Synchronisation
  • Notiz erstellt
  • Notiz aktualisiert oder gelöscht
  • App gestartet oder fortgesetzt

Wird nun zum Beispiel eine Org-Datei im o.g. Verzeichnis neu angelegt und synchronisiert, so wird diese von Orgzly erkannt und berücksichtigt. D.h. neue Aufgaben und Notizen werden so unmittelbar automagisch mit eingebunden.

Alternative Syncthing-Zwischenstelle

Die Synchronisation zwischen Smartphone und dem Desktop ist natürlich nur möglich, wenn beide Geräte gleichzeitig online sind. Wenn das selten der Fall sein sollte, dann macht es Sinn die Synchronisation über eine weitere, zwischengeschaltete Instanz laufen zu lassen, die permanent online ist. Hierzu ist z.B. ein stromsparender Raspberry Pi ausreichend, der als Zwischenstelle immer für einen Abgleich zur Verfügung stehen kann. Auf dem PI wäre dann in diesem Falle eine weitere Syncthing-Instanz installiert, welche zwischen Desktop und Smartphone vermittelt: Desktop <-> PI <-> Smartphone

Emacs etwas reaktiver

Ist Emacs mit einer Org-Datei geöffnet, so ist es ärgerlich, wenn neue oder geänderte Notizen für diese Datei nicht direkt angezeigt werden, wenn diese z.B. von außen mit dem Smartphone erstellt oder geändert wurden. Ein manuelles, erneutes Laden wäre da eher nervig. Damit derartige Änderungen direkt automagisch angezeigt werden, aktiviert man den auto-revert-mode beim Start von Emacs via folgender Ergänzung seitens init.el:

(global-auto-revert-mode t)

Das automagische Anzeigen der synchronisierten Änderungen funktioniert tadellos, wenn die im Emacs geladene Datei keine ungespeicherten Änderungen enthält. Sollte dies mal nicht der Fall sein, so gibt Emacs (unabhängig vom auto-revert-mode) beim darauf folgenden Speicherversuch einen Warn-Dialog aus:

dateiname.org has changed since visited or saved. Save anyway? (yes or no)

Bei einem derartigen Fall ist es empfehlenswert, erst einmal die Änderungen unter einem anderen Dateinamen abzuspeichern und die beiden Dateien mit der Funktion ediff-buffers abzugleichen.

Wird allerdings eine Änderung gespeichert kurz bevor eine andere Änderung über die Synchronisation eingeht, so gibt es definitiv einen Konflikt, welcher nur von syncthing selbst aufgezeigt werden kann. In diesem Falle wird die Datei mit der jüngsten Änderung von syncthing übernommen und die andere Version wird als neue Datei mit dem Namen <dateiname>.sync-conflict-<datum>-<zeit>.<org> im gleichen Verzeichnis abgelegt. Doch auch dann kann der User die Konflikte zwischen den beiden Dateien selbst auflösen, wofür sich ebenfalls wieder die Funktion ediff-buffers anbietet.