blog · git · desktop · images · contact


xib: XTerm Interactive Browser

2013-09-14

Es entstand aus der Unzufriedenheit mit gitk heraus. Das Tool ist eigentlich total toll und ich verwende es ständig. Ein riesiges Manko jedoch: Es speichert sich die Anordnung der GUI-Elemente. Klingt ja eigentlich praktisch, aber gerade an einem Laptop, bei welchem häufig wechselnde Bildschirmauflösungen verwendet werden, ist das tendenziell lästig. Und wenn man dann noch einen Tiling-WM verwendet, bei dem das Fenster stark in der Größe verändert werden kann, wird’s enorm lästig. (Ja, ich kann gitk auf „floating“ setzen. Habe ich auch. Ist aber auch nicht das Gelbe vom Ei.)

Dann habe ich mir mal angeschaut, zu welchem Zweck ich gitk eigentlich verwende. Es stellt sich heraus: Ich starte das Ding ausschließlich, um einen schnellen Überblick über das Repo zu bekommen. Wo steht welcher Branch, wie sehr habe ich mich von Remotes entfernt, wo sind Tags und so weiter. Und man kann locker durch ein Repo browsen und die Änderungen betrachten, ohne sich mit Commit Hashes auseinandersetzen zu müssen.

Hmm. Geht das nicht auch anders? Brauche ich wirklich gitk? Einen Großteil der Informationen verrät mir schon „git log --oneline --graph --decorate“:

Screenshot

Was da noch fehlt, ist eben die direkte Anzeige eines Commits. Also eigentlich ein „git show“.

Hmm.

Am Ende des Gedankengangs entstand „xib“ und mein gitk-Ersatz damit sieht so aus:

Screenshot von xib mit git log

Das läuft im Terminal, ist Tiling-WM geeignet und erfüllt meine Anforderungen. Prima!

Okay und wie funktioniert xib? Was genau tut es? Ganz einfach: Es liest Zeilen von STDIN und präsentiert einem das „Browserfenster“, in dessen oberer Hälfte man eine der gelesenen Zeilen auswählen kann. Für eine ausgewählte Zeile wird dann ein vom Benutzer wählbarer Befehl ausgeführt, dem genau die Zeile als Argument übergeben wird.

Einfaches Beispiel:

echo $'Das hier ist Zeile 1,\nhier kommt Zeile 2\nund zum Schluss Zeile 3.' | xib echo

Ergebnis:

Screenshot von xib mit echo-Beispiel

Dementsprechend ist mein gitk-Ersatz so aufgebaut: „git log“ wird dem xib als Eingabe auf STDIN präsentiert (gka) und ein kleines zweites Skript (xib_gitshow), das aus einer „git log“-Zeile den Commit Hash rausholt, zeigt dann über „git show“ den Commit an. Fertig.

xib selbst weiß also gar nichts von Git. Es ist allgemein gehalten. Daher ist auch sowas hier möglich, um ganz schnell einen Überblick über Textdateien in einem Verzeichnis zu erhalten:

ls | xib cat

Screenshot von xib mit ls und cat

Oder etwas abgefahrener:

ls *jpg | xib -- siv2 -s 210x62

Screenshot von xib mit ls und siv2

Ein Detail noch: Man würde erwarten, dass xib ncurses verwendet. Tut es nicht. Habe ich zuerst probiert, aber dann gemerkt, dass ich gerne sowohl die von STDIN gelesenen Zeilen als auch das, was das aufgerufene Programm ausgibt, verbatim anzeigen will. Insbesondere betrifft das Escape-Sequenzen für Farben: Der Diff von „git show“ soll ja bunt sein, ebenso der Graph und die Labels von „git log“. Es gelang mir mit ncurses nicht, Text inklusive Escape-Sequenzen auszugeben. Ist ja auch nachvollziehbar: Escape-Sequenzen können das Terminal in einen komplett anderen Zustand bringen, aber ncurses hätte gerne alles unter Kontrolle.

Das zwang mich dann, ein bisschen Terminalkontrolle selbst auszuprogrammieren. Hält sich in Grenzen, weil xib sehr einfach ist. Aber das „XTerm“ hat es nicht ohne Grund im Namen: Bestimmte Dinge funktionieren nur mit einem XTerm. Das schränkt die allgemeine Benutzbarkeit zwar ein, aber das Leben ist eben kein Ponyhof. :-)

xib ist Teil meines bin-pub-Repos und wird es aufgrund der geringen Größe wohl auch bleiben. Die belegten Tasten sind im Quellcode ganz oben erwähnt.

Comments?