Simon Szustkowski

Ein Blog über alles, was mir gerade so durch den Kopf geht

Sep 6, 2017

Dynamisch generiertes Cheatsheet für i3-Keybindings

Nutzt man, wie ich, den Fenstermanager i3, so sammelt man sicherlich ebenfalls im Laufe der Zeit diverse Tastenshortcuts, um Dinge zu erledigen. So viele Tastaturshortcuts sind aber nicht so einfach zu merken, und immer in der i3-Config nachsehen ist lästig. Daher habe ich versucht, sowas wie ein dynamisches Cheatsheet zu bauen.

Ich beschreibe es im Folgenden für die fish, da ich sie nutze, und sie etwas anders funktioniert als die Bash oder andere Shells. Zur Adaption auf die Bash sollte es reichen, die Fish-Funktion als Alias zu definieren oder so.

Zuallererst definieren wir uns eine neue Funktion, die die i3-Config ausliest und nett formatiert. Hierzu schreiben wir folgendes in die $HOME/.config/fish/functions/i3cheatsheet.fish:

function i3cheatsheet
  grep -E "^bindsym" ~/.config/i3/config | awk '{$1=""; print $0}' | sed 's/^ *//g' | grep -vE "^XF86" | column | pr -2 -w 160 -t | less 
end

Diese Funktion macht folgendes: 1. Auslesen aller Config-Zeilen, die mit bindsym beginnen, also alle Zeilen, die einen Shortcut definieren 2. Entfernen des bindsym Keywords am Anfang 3. Entfernen des Leerzeichens am Anfang 4. Entfernen aller Zeilen, die einen Shortcut definieren, der auf einer XF68-Sondertaste liegt. Diese Tasten spezifizieren z.B. auf Thinkpads die Sondertasten für Helligkeit oder Systemlautstärke 5. Ausgabe der Liste in zwei Spalten 6. Etwas nettere Formatierung 7. Anzeige des Resultats in less

Bestimmt geht das noch eleganter, aber so funktioniert es erstmal. Nach einem Neustart der fish sollte der i3cheatsheet Befehl schon mal eine Liste eurer Tastaturshortcuts ausgeben.

Als nächstes bauen wir ein Shellscript, was ein Terminal starten soll, dem Terminal einen Titel zuweist (wichtig für die spätere Integration in i3), und diese Funktion startet. Ich speichere alle Shell-Helper-Scripte für i3 ebenfalls in $HOME/.config/i3, weil sie ja zu meiner i3-Config dazu gehören, aber eigentlich ist es egal, wo genau ihr das speichert. Folgendes muss da rein:

#! /usr/bin/fish                                           
xfce4-terminal -T 'i3 Shortcuts' -x fish -c "i3cheatsheet" 

Dieses Script startet xfce4-terminal und setzt dessen Titel auf “i3 Shortcuts”, und führt dann in dem Terminal die fish mit dem i3cheatsheet Command aus. Ich führe die Fish bewusst nicht interaktiv aus, weil sonst in meiner Konfiguration ein tmux mit gestartet werden würde. Da sowieso direkt die Funktion aufgerufen wird, ist da eh nicht viel Interaktion.

Manche würden jetzt z.B. noch hingehen, und xfce4-terminal mit der -H Option aufrufen. Die -H Option sorgt dafür, dass das Terminal nach dem Beenden des letzten Befehls noch offen stehen bleibt. Da wir aber less als Output benutzen, und less sowieso erstmal bestehen bleibt, bis man q drückt, ist das Flag egal - es würde sogar verhindern, dass sich das Terminal wieder schließt, wenn man less beendet. Sinn ergeben würde es beispielsweise, wenn man zur Ausgabe stattdessen cat benutzen würde.

Zuletzt definieren wir noch einen neuen Shortcut in i3, was dieses Shellscript ausführen soll. Wir setzen zusätzlich für das Terminalfenster mit dem Titel “i3 Shortcuts” noch einige Eigenschaften, sodass es einem simplen Overlay sehr ähnlich sieht.

Folgende Zeilen kommen dazu in die i3-Config:

# i3 Cheat Sheet
bindsym F10 exec --no-startup-id $HOME/.config/i3/i3cheatsheet.sh
for_window [instance="xfce4-terminal" title="i3 Shortcuts"] floating enable, move absolute position center, resize grow left 318, resize grow right 318, resize grow down 115, resize grow up 115

Nach einem Neustart von i3, bzw. einem Neueinlesen der Config könnt ihr euch nun mit F10 das Cheatsheet als Overlay anzeigen lassen, und das Overlay mit q wieder schließen.