4 Punkte von GN⁺ 2024-06-08 | 1 Kommentare | Auf WhatsApp teilen
  • lsix ist ein Bash-Skript, das wie ls für das aktuelle Verzeichnis oder eine angegebene Dateiliste Bilder als Thumbnails direkt im Terminal anzeigt und dafür Sixel-Grafik verwendet
  • Es nutzt ImageMagick zur Verarbeitung vieler Bildformate; wenn GIFs oder Dateien mit mehreren Bildern auf der Kommandozeile angegeben werden, werden die Frames aufgefächert und als Montage dargestellt
  • Es erkennt, ob das Terminal Sixel unterstützt, Vordergrund- und Hintergrundfarbe, ob Farbregister erweitert werden können, sowie die Fensterbreite und passt daran Thumbnail-Qualität und Anordnung an
  • Zur Installation genügt es, die Datei lsix in den Pfad zu legen und ImageMagick bereitzustellen; unter macOS kann mit brew install lsix auch ImageMagick mitinstalliert werden
  • Da XTerm den Sixel-Modus standardmäßig deaktiviert hat und einige Terminals inkompatibel sind, sollte vor der tatsächlichen Nutzung geprüft werden, ob ein Sixel-kompatibles Terminal vorliegt

Ein Terminal-Bildlistenwerkzeug wie ls

  • lsix ist ein Werkzeug, das einem ls für Bilder nahekommt und Dateithumbnails inline im Terminal anzeigt
  • Die grundlegende Nutzung ist einfach
    • Mit nur lsix werden die Bilder im aktuellen Arbeitsverzeichnis angezeigt
    • Dateinamen können in der Form lsix [ FILES ... ] angegeben werden
    • Shell-Wildcards sind möglich, etwa lsix *jpg * png
  • Für die Ausgabe wird Sixel-Grafik verwendet

Formatverarbeitung und Anzeige auf Basis von ImageMagick

  • Da ImageMagick verwendet wird, werden viele Bildformate unterstützt
  • Formate wie PDF, deren Rendering langsam sein kann, werden nicht angezeigt, sofern sie nicht ausdrücklich angefordert werden
    • Um ein bestimmtes Format zu erzwingen, kann der Dateiname direkt angegeben oder ein Wildcard wie *.pdf verwendet werden
  • Wenn GIFs oder Dateien mit mehreren Bildern auf der Kommandozeile angegeben werden, werden alle Frames aufgefächert und als Montage angezeigt
    • Bei GIFs können manche Frames nur die gegenüber dem vorherigen Frame geänderten Pixel speichern
  • Auch Nicht-Bitmap-Grafiken können funktionieren
    • Beispiele: .svg, .eps, .pdf, .xcf

Erkennung der Terminal-Umgebung

  • lsix verwendet Steuersequenzen, um zu erkennen, ob das Terminal Sixel-Grafik inline darstellen kann
  • Die Alphakanäle von PNG und SVG werden passend zur Hintergrundfarbe des Terminals verarbeitet
    • lsix versucht, über Terminal-Escape-Sequenzen Vordergrund- und Hintergrundfarbe zu ermitteln
    • Die Vordergrundfarbe wird für die Textfüllfarbe verwendet
  • Wenn ein Terminal erkannt wird, das wie xterm die Anzahl der Farbregister erhöhen kann, wird diese zur Verbesserung der Bildqualität automatisch erweitert
  • In Terminals mit Unterstützung für dtterm WindowOps wird die Zahl der Kacheln pro Zeile an die Fensterbreite angepasst
  • Wenn ein Verzeichnis viele Bilder enthält, wird vermieden, auf die Erstellung der gesamten Montage zu warten
    • Bei mehr als 21 Bildern erfolgt die Anzeige zeilenweise
  • Wenn Dateinamen zu lang sind, wird der Text umbrochen, bevor er an ImageMagick montage übergeben wird
    • Ohne lsix können sich lange Dateinamen bei montage überlappen
  • Unicode-Dateinamen funktionieren, sofern die verwendete Schrift entsprechende Glyphen enthält

Installation und Konfiguration

  • Zur Installation reicht es, die Datei lsix in einen Pfad wie /usr/local/bin zu legen und auszuführen
  • lsix ist ein Bash-Shell-Skript
  • Die einzige erforderliche Software ist ImageMagick
    • Beispiel: apt-get install imagemagick
  • macOS-Nutzer können brew install lsix verwenden
    • Falls nötig, wird dabei auch ImageMagick installiert
  • Das aktuelle Design ist sehr einfach gehalten
    • Keine Kommandozeilen-Flags
    • Keine Konfigurationsdatei
    • Keine Stellschrauben zur Feinabstimmung
  • Werte wie Kachelbreite, Schriftfamilie und Punktgröße lassen sich durch Anpassen von Variablen am Anfang der Datei ändern
    • Die Liste installierter Schriftarten lässt sich mit convert -list font prüfen

Anforderungen an Sixel-fähige Terminals

  • Das Terminal muss Sixel-Grafik unterstützen
  • Das Terminal kann mit der Ausgabe eines einzelnen Bildes als Sixel getestet werden
convert foo.jpg -geometry 800x480 sixel:-
  • Für die Entwicklung wurde der vt340-Emulationsmodus von xterm verwendet
  • XTerm hat den Sixel-Modus standardmäßig nicht aktiviert
    • Beim Start kann xterm -ti vt340 verwendet werden
    • Alternativ kann .Xresources um xterm*decTerminalID : vt340 ergänzt und anschließend xrdb -merge .Xresources ausgeführt werden
  • Einige Distributionen wie Fedora können xterm ohne Sixel-Unterstützung kompilieren
    • In diesem Fall können alternative Terminals wie foot oder mlterm ausprobiert werden

Kompatible und inkompatible Terminals

  • Als Sixel-kompatibel bestätigt oder gemeldet
    • XTerm, MLterm, foot, Wezterm, Contour, iTerm2 for Apple MacOS und Yaft wurden getestet
    • Konsole, yakuake, WSLtty for Microsoft Windows, MinTTY for Cygwin, VTE-Spezialkompilierung, sixel-tmux und ttyd wurden gemeldet
  • Sixel-inkompatible Terminals
    • MacOS Terminal, kitty
    • Standard-Terminals auf Basis von libvte
      • gnome-terminal
      • terminator
      • lxterm
    • Alacritty kann mit einem Patch funktionieren

Bekannte Bugs und Einschränkungen

  • Der Reverse-Video-Modus von XTerm, xterm -rv, unterscheidet sich davon, Vordergrund- und Hintergrundfarbe explizit zu setzen
    • Explizite Angaben lassen sich erkennen, die reverseVideo-Ressource jedoch nicht, daher kann die Hintergrundfarbe falsch sein
  • Die Bildschirmbreite von XTerm ist derzeit auf 1000px begrenzt
    • Die Begrenzung soll entfernt werden, sobald xterm Bilder größer als 1000x1000 verarbeiten kann
    • Zuletzt getestet mit XTerm(344)
  • Dateinamen, die mit @ beginnen, werden von ImageMagick speziell behandelt
    • Es muss ein Verzeichnispräfix wie in lsix ./@foo.png vorangestellt werden
    • Das ist kein lsix-, sondern ein ImageMagick-Bug
  • Wenn der leere String "" als Dateiname angegeben wird, hängt sich ImageMagick auf
    • Das scheint ein Bug oder Fehlverhalten von ImageMagick zu sein
  • Der Umbruch langer Dateinamen funktioniert, ist aber nicht intelligent
    • Umbrüche an Leerzeichen, Bindestrichen, Unterstrichen oder Punkten sind noch nicht implementiert
  • Wenn auf der Kommandozeile ein Verzeichnis angegeben wird, behandelt das Programm es so, als hätte der Nutzer in dieses Verzeichnis cd ausgeführt
    • Rekursive Verarbeitung wäre nicht schwer, aber es besteht Zurückhaltung, Kommandozeilen-Flags zu einem einfachen Skript hinzuzufügen
  • Das Ausführen von lsix foo.avi kann Probleme verursachen

Sixel-Standard und Implementierungsgrenzen

  • Im Sixel-Standard scheint es keine Möglichkeit zu geben, die Größe der Grafikfläche abzufragen
  • Laut der VT340-Dokumentation muss das Programm die Auflösung des Ausgabegeräts bereits kennen
  • XTerm 344 ergänzt zur Lösung dieses Problems die Steuersequenz CSI ? Pi ; Pa ; Pv S
    • Einige Terminals wie mlterm haben diese noch nicht implementiert
  • Eine Alternative ist das Auslesen der Fenstergröße über die dtterm-WindowOps-Erweiterung
    • Die Geometrie der Sixel-Grafikfläche und die Fenstergröße sind nicht zwingend identisch, daher ist das keine exakte Lösung
    • So begrenzt xterm die Grafikgeometrie beispielsweise auf 1000x1000, auch wenn das Fenster größer ist
  • Wenn beide Methoden fehlschlagen, nimmt lsix eine VT340-Umgebung an
    • Auflösung: 800x480
    • Es wird davon ausgegangen, dass nur 6 Kacheln pro Zeile hineinpassen
  • Der Sixel-Standard bietet auch keine Möglichkeit, die Anzahl verfügbarer Farbregister abzufragen
    • lsix verwendet dafür eine xterm-Erweiterung
    • Wenn das Terminal nicht antwortet, wird wieder von einem ursprünglichen VT340 ausgegangen und es werden nur 16 Farbregister verwendet

Warum nicht libsixel?

  • libsixel ist ein Projekt zur Ausgabe optimierter Sixel-Grafikbefehle
  • lsix verwendet statt libsixel Bash und ImageMagick
    • Bash und ImageMagick sind weit verbreitet, damit es überall leicht läuft
    • Das Skript bleibt bewusst einfach, sodass Nutzer es leicht anpassen und erweitern können
    • ImageMagick kann mehr Eingabeformate lesen als das von libsixel verwendete img2sixel mit stb_image
      • Beispiele: xpm, svg, 16-bit png, sixel-Dateien
    • ImageMagick kann Eingaben lesen und die Sixel-Ausgabe direkt schreiben
    • libsixel mag schneller sein, aber für die einfache Anzeige eines Verzeichnisinhalts ist ImageMagick ebenfalls schnell genug

Weiterführende Materialien

1 Kommentare

 
GN⁺ 2024-06-08
Hacker-News-Kommentare
  • Wenn du wie ich kaum ohne tmux im Terminal arbeiten kannst, wurde der experimentelle Sixel-Branch vor etwa 10 Monaten endlich gemergt
    Jetzt kannst du das Mainline-tmux mit --enable-sixel bauen und Werkzeuge wie lsix innerhalb von tmux verwenden
    Wenn du wissen willst, ob dein bevorzugtes Terminal oder dein Terminal-Multiplexer Sixel unterstützt, schau auf die Seite „Are We Sixel Yet“
    https://github.com/tmux/tmux/commit/dfbc6b1888c110cf0ade66f2...
    https://www.arewesixelyet.com

    • Ich bin vor ein paar Jahren zu Zellij gewechselt und nutze die Sixel-Unterstützung seit irgendwann 2022 sehr gut
      Wenn du deinem Workflow etwas Veränderung geben willst, ist es im Auslieferungszustand meiner Meinung nach eine deutlich bessere Erfahrung als tmux
      Funktionen, die man sonst über externe Plugins und komplexe Konfigurationsskripte nachgerüstet hätte, sind von Haus aus enthalten, und auch Stabilität und Performance waren deutlich besser
      https://zellij.dev/
    • Ich verstehe den Einsatzzweck von tmux nicht wirklich
      Kann jemand erklären, warum es im Workflow zu einem unverzichtbaren Werkzeug wird und warum es auch für meinen Workflow unverzichtbar sein könnte?
    • Aber warum braucht man das überhaupt? Warum sollte man Pixelgrafik unbedingt in ein textbasiertes niedrig aufgelöstes Raster pressen? Warum nicht einfach normale Pixelgrafik verwenden?
    • Ich nutze tmux schon sehr lange und davor screen, aber ich verstehe nicht ganz, warum Sixel so einen großen Unterschied macht
      Ist das im Vergleich zum heutigen Tiling so eine Veränderung, als würde man einen Stack-basierten Window-Manager in tmux bringen? Oder geht es einfach nur darum, dass Terminalgrafik besser wird? Verstehe ich das komplett falsch?
      Wenn es nur darum geht, dass die Grafik besser wird, verstehe ich nicht, warum tmux das unterstützen muss; wichtiger erscheint mir da die Seite der Terminal-Emulatoren wie Gnome Terminal. Vielleicht braucht man beides, aber ich dachte, tmux müsste das einfach nur durchreichen
    • Weiß zufällig jemand, ob bei einer Installation von tmux per brew Sixel aktiviert ist?
  • Mein Lieblingsfeature in diesem Repository ist das Verzeichnis README.md.d
    Eine ziemlich gute Idee, und eigentlich könnte man das .md wohl sogar weglassen

    • Der wirklich geniale Zug wäre, Bilder direkt als Sixel in die README-Datei einzubetten
      Dann könnte schon ein einfaches cat README die Bilder direkt anzeigen
  • Mit "\e[c" wird automatisch erkannt, ob Sixel unterstützt wird
    https://github.com/hackerb9/lsix/blob/3a431793a747df3f934051...
    "\e[c" steht für „send device attributes“
    https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-F...

  • Die Idee ist cool, aber unter PuTTY/KiTTY funktioniert es nicht
    Wenn man $ lsix ausführt, kommt die Fehlermeldung, dass das Terminal keine Unterstützung für Sixel-Grafik meldet, und es wird empfohlen, ein Sixel-fähiges Terminal wie xterm -ti vt340 zu verwenden oder den Terminal-Entwickler um Unterstützung zu bitten
    Einzelne Bilder kann man mit convert foo.jpg -geometry 800x480 sixel:- testen, und wenn es in einem tatsächlich unterstützten Terminal trotzdem nicht funktioniert, soll man unter http://github.com/hackerb9/lsix/issues einen Bug melden
    Der Code für die Geräteattribute wird als ^[[?6c angezeigt
    Schade. Das wäre ziemlich schick gewesen. Gibt es ein Open-Source-Windows-Terminal, das Sixel unterstützt? Meistens sehe ich nur Dinge rund um Cygwin oder WSL, aber kaum etwas für pures Windows

    • Ich habe vor Kurzem angefangen, wezterm zu benutzen, und bin ziemlich angetan
      Es ist plattformübergreifend und unterstützt Sixel-Grafik
      https://github.com/wez/wezterm
    • Mintty ist ein hervorragendes Windows-Terminal mit Sixel-Unterstützung
  • Ähnlich gelagert gibt es auch timg: https://github.com/hzeller/timg

  • In iTerm2 für MacOS ist eine ähnliche Funktion eingebaut, und die Last auf der Serverseite ist noch geringer
    Statt Bilder auf dem Server mit vielen Bildbibliotheken als Sixel zu rendern, wird das gesamte Bild per base64 kodiert an den Client geschickt, und der Client erkennt das Bildformat und rendert es lokal im Terminal
    https://iterm2.com/documentation-images.html

    • konsole hat dasselbe Protokoll ebenfalls implementiert
      Unter Linux verwende ich das unveränderte imgcat-Skript direkt
      Natürlich ist das viel schneller, als mit ImageMagick zu konvertieren, aber ich habe lsix trotzdem zusätzlich ins bin-Verzeichnis gelegt
  • Man sollte vorsichtig sein, wenn man das in nicht vertrauenswürdigen Verzeichnissen ausführt
    Gerade Dinge, die Bilder parsen, etwa PDFs, können wie andere Tools auch riskant sein, und bei ImageMagick sollte man noch vorsichtiger sein

    • Ist das Parsen nicht vertrauenswürdiger Bilder grundsätzlich problematisch?
      Wenn ich einen nicht vertrauenswürdigen Download-Ordner in Gnome Files öffne und die darin enthaltenen Bilder angezeigt und damit geparst werden, ist das dann ein Sicherheitsproblem, über das man sich Sorgen machen sollte?
      Ich dachte, Dinge wie JavaScript in PDFs könnten problematisch sein, aber dass schon einfache Vorschauen riskant sein könnten, war mir nicht klar
  • Das verwendete Terminal muss Sixel-Grafik unterstützen

    • Ich habe eine Grafikbibliothek für Terminals gebaut, die Sixel nicht unterstützen
      https://github.com/dheera/python-termgraphics
      Es könnte interessant sein, diese Bibliothek anzupassen und als Fallback-Pfad zu unterstützen
    • xterm unterstützt Sixel, also müsste doch alles kompatibel sein, wenn man Werte wie TERM=xterm256-color setzt … oder? hust gnome-terminal hust
    • mlterm funktioniert
  • fzf bietet seit 0.44.0 experimentelle Unterstützung für Sixel-Bilder im Vorschaufenster
    Unter Windows kann man das nicht verwenden
    https://github.com/junegunn/fzf/releases/tag/0.44.0
    fzf --preview='fzf-preview.sh {}'

    • Als Alternative kann man fzf --preview 'convert {} -geometry 800x480 sixel:-' verwenden
      Dafür muss ebenfalls ImageMagick installiert sein