- 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
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-sixelbauen und Werkzeuge wielsixinnerhalb von tmux verwendenWenn 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
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/
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?
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
brewSixel aktiviert ist?Mein Lieblingsfeature in diesem Repository ist das Verzeichnis
README.md.dEine ziemlich gute Idee, und eigentlich könnte man das
.mdwohl sogar weglassenDann könnte schon ein einfaches
cat READMEdie Bilder direkt anzeigenMit
"\e[c"wird automatisch erkannt, ob Sixel unterstützt wirdhttps://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
$ lsixausführt, kommt die Fehlermeldung, dass das Terminal keine Unterstützung für Sixel-Grafik meldet, und es wird empfohlen, ein Sixel-fähiges Terminal wiexterm -ti vt340zu verwenden oder den Terminal-Entwickler um Unterstützung zu bittenEinzelne 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 meldenDer Code für die Geräteattribute wird als
^[[?6cangezeigtSchade. 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
Es ist plattformübergreifend und unterstützt Sixel-Grafik
https://github.com/wez/wezterm
Ä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
Unter Linux verwende ich das unveränderte
imgcat-Skript direktNatürlich ist das viel schneller, als mit ImageMagick zu konvertieren, aber ich habe
lsixtrotzdem zusätzlich insbin-Verzeichnis gelegtMan 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
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
https://github.com/dheera/python-termgraphics
Es könnte interessant sein, diese Bibliothek anzupassen und als Fallback-Pfad zu unterstützen
TERM=xterm256-colorsetzt … oder? hust gnome-terminal hustfzf 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 {}'fzf --preview 'convert {} -geometry 800x480 sixel:-'verwendenDafür muss ebenfalls ImageMagick installiert sein