Eine Org Datei im Einsatz als Config-File
Ein gutes Dateiformat spart ein Separates KunfigurationsprgrammWer mich im Fediverse verfolgt wird mitbekommen haben, dass ich seit einiger Zeit nicht mehr versuche, mein Stream Deck dauerhaft zu konfigurieren, sondern mir stattdessen eine eigene Lösung programmiert habe.
Diese Lösung besteht ganz kurz gesagt aus zwei einzelnen Komponenten. Erstens, einem Client, der auf meinem Handy läuft und mir 32 Tasten mit kleinen Bildchen auf dem Bildschirm anzeigt, und zweitens einem Server, den ich DeckServer nenne, der verschiedene Buttonlayouts, die ich sonst auf dem Stream Deck gesehen habe, an diesen Client ausspielt.
Das Problem
Der Deck Server läuft wie schon der Name nahelegt als Service im Hintergrund und hat keine eigene Oberfläche. Um die Buttons, die der Server an den Client ausspielen soll, zu konfigurieren, bräuchte ich also normalerweise ein kleines Programm mit einer Benutzeroberfläche, auf der ich den einzelnen Buttons Bilder zuweisen kann, dann festlegen kann, welche Befehle jeder einzelne Button ausführen soll, und wie zwischen den einzelnen Button Layouts hin- und hergeschaltet wird.
Als ich ein wenig darüber nachgedacht habe, fiel mir jedoch eine sehr viel einfachere Lösung ein. Schließlich lebe ich quasi in meinem Emacs Editor und dort vor allem in Org-Mode Dateien.
So eine Org-Mode Datei ist, wie auch die bekannten Konfigurationsdateien aus Windows, hierarchisch aufgebaut, kann dabei jedoch deutlich mehr Ebenen verwalten.
Eine typische Hierarchie in einer Org-Mode-Datei für Konfigurationen könnte so aussehen:
- Hauptkategorien (z. B.
* Stream Deck Buttons)- Unterkategorien (z. B.
** Layouts)- Einzelne Buttons (z. B.
*** Button 1)- Attribute (z. B.
:BILD: ~/bilder/start.png,:Befehl: systemctl start ...)
- Attribute (z. B.
- Einzelne Buttons (z. B.
- Navigation (z. B.
** Layout-Wechsel)- Tastenbelegung (z. B.
*** Taste 5 → Layout "Streaming")
- Tastenbelegung (z. B.
- Unterkategorien (z. B.
Org-Mode nutzt Überschriften (*, **, ***), um die Struktur abzubilden. Eigenschaften (:PROP: wert) oder Listen (- ...) definieren Details.
Eine weitere Besonderheit von Org-Mode Dateien kam hier für die Konfiguration des Deck-Service allerdings sehr entgegen. Org-Mode kann Tabellen.
Die Lösung
Tabellen in Org-Mode werden mit | (Pipe), - (Bindestrich) und + (Plus) aufgebaut:
| Spalte 1 | Spalte 2 | Spalte 3 |
|----------+----------+----------|
| Wert A | Wert B | Wert C |
| Wert D | Wert E | Wert F |
- Zeilen: Jede Zeile beginnt und endet mit
|. - Trennlinie: Eine Zeile mit
-(mind. 2) und+definiert Spalten. - Ausrichtung: Bei Eingabe richtet Org-Mode automatisch nach dem längsten Eintrag aus.
Bei Änderung (z.B. einem längeren Befehl) passt Org-Mode die Spaltenbreite an.
| Name | Befehl | Icon |
|----------+-----------------+---------------|
| Start | systemctl start | ~/icons/start |
| Stop | systemctl stop | ~/icons/stop |
Ich habe mir also ein Layout, so wie ich es gerne hätte, in Ork Mode einfach zusammengeschrieben. Dazu habe ich es unter zwei Überschriften verpackt. Auf der obersten Ebene einfach nur das Wort Layout, darunter eine Überschrift mit dem Namen dieses einen spezifischen Layouts.
* Layouts
** Haptmenü
|--------+------+----------+-------+--------+-------+--------+---|
| Home | Mail | Internet | Emacs | Musik | Video | | |
|--------+------+----------+-------+--------+-------+--------+---|
| | | | | | | | |
|--------+------+----------+-------+--------+-------+--------+---|
| | | | | | | | |
|--------+------+----------+-------+--------+-------+--------+---|
| Zurück | Stop | Pause | Vor | Leiser | Stumm | Lauter | |
|--------+------+----------+-------+--------+-------+--------+---|
In der dritten Ebene habe ich dann für jeden der oben beschrifteten Buttons dessen Eigenschaften unter einer jeweils eigenen Überschrift zusammengeschrieben. Das sah zum Beispiel so aus;
*** Home
:PROPERTIES:
:Label: Home
:Image: /home/andy/ablage/icons/WhiteOnBlack/128/Very-Basic-Home-Filled-icon.png
:Actions: Layout
:Parameters: Home
:Color: #000000
:END:
*** Emacs
:PROPERTIES:
:Label: Emacs
:Image: emacs.png
:Actions: Layout, Execute
:Parameters: EmacsMain, emacs
:Color: #000000
:END:
Wie man sieht wird hier für jeden Button festgelegt, welche Beschriftung auf ihm zu sehen sein soll, welches Bild und was passieren soll, wenn man den Button drückt. Im Falle des Emacs-Buttons zum Beispiel wird das Layout zum Layout EmacsMain gewechselt und anschließend der Befehl emacs auf der Kommando-Zeile ausgeführt.
Die Vorteile
Die Vorteile liegen auf der Hand.
- Wenn mir spontan weitere Konfigurations-Möglichkeiten einfallen, kann ich dir einfach zusätzlich in die Datei schreiben und den Parser im Server für diese Datei ein wenig anfassen.
- Wenn ich ein weiteres Layout erstellen möchte, kopiere ich einfach ein vorhandenes und andere die Beschriftungen in der Tabelle. Fertig.
- Buttons die ähnliche Dinge tun, kann ich einfach kopieren und die Unterschiede direkt ändern.
All das in dem Editor, den ich sowieso den ganzen Tag geöffnet habe. Emacs