4 puntos por GN⁺ 2024-06-08 | 1 comentarios | Compartir por WhatsApp
  • lsix es un script Bash que, como ls, toma como objetivo el directorio actual o una lista de archivos especificada y muestra imágenes como miniaturas dentro de la terminal; para la salida usa gráficos Sixel
  • Usa ImageMagick para procesar varios formatos de imagen y, si se especifica en la línea de comandos un GIF o un archivo que contiene varias imágenes, despliega los fotogramas y los muestra como un montaje
  • Detecta si la terminal admite Sixel, los colores de primer plano y de fondo, si se pueden ampliar los registros de color y el ancho de la ventana, y ajusta la calidad y la distribución de las miniaturas
  • Para instalarlo, basta con poner el archivo lsix en el PATH y tener ImageMagick preparado; en macOS se puede instalar junto con ImageMagick usando brew install lsix
  • En XTerm el modo Sixel viene desactivado por defecto y algunas terminales no son compatibles, por lo que antes de usarlo conviene verificar que sea una terminal compatible con Sixel

Herramienta de listado de imágenes en la terminal, para usar como ls

  • lsix es una herramienta parecida a ls para imágenes, que muestra miniaturas de archivos en línea dentro de la terminal
  • La forma básica de ejecutarla es simple
    • Si se ingresa solo lsix, muestra las imágenes del directorio de trabajo actual
    • Se pueden especificar nombres de archivo con la forma lsix [ FILES ... ]
    • Permite usar comodines del shell, por lo que es posible ejecutar algo como lsix *jpg * png
  • Para la salida usa gráficos Sixel

Procesamiento de formatos y modo de visualización basados en ImageMagick

  • Como usa ImageMagick, admite una amplia variedad de formatos de imagen
  • Los formatos que pueden tardar en renderizarse, como PDF, no se muestran a menos que se soliciten explícitamente
    • Para listar a la fuerza un formato específico, se puede indicar directamente el nombre del archivo o usar un comodín como *.pdf
  • Si en la línea de comandos se especifica un GIF o un archivo que contiene varias imágenes, despliega todos los fotogramas y los muestra como un montaje
    • Un GIF puede guardar algunos fotogramas solo con los píxeles que cambiaron respecto del fotograma anterior
  • También pueden funcionar gráficos que no sean mapas de bits
    • Por ejemplo: .svg, .eps, .pdf, .xcf

Funciones de detección del entorno de la terminal

  • lsix usa secuencias de control para detectar si la terminal puede mostrar gráficos Sixel en línea
  • Los canales alfa de PNG y SVG se procesan de acuerdo con el color de fondo de la terminal
    • lsix intenta obtener el color de primer plano y de fondo mediante secuencias de escape de la terminal
    • El color de primer plano se usa como color de relleno del texto
  • Si detecta una terminal que puede aumentar la cantidad de registros de color, como xterm, los amplía automáticamente para mejorar la calidad de la imagen
  • En terminales compatibles con dtterm WindowOps, ajusta la cantidad de mosaicos por línea según el ancho de la ventana
  • Cuando hay muchas imágenes en un directorio, evita esperar a que se genere el montaje completo
    • Si hay más de 21 imágenes, las muestra línea por línea
  • Si el nombre de archivo es demasiado largo, ajusta el texto con saltos de línea antes de pasarlo a montage de ImageMagick
    • Si se usa montage sin lsix, los nombres de archivo largos pueden superponerse entre sí
  • Los nombres de archivo Unicode funcionan si la fuente utilizada tiene los glifos correspondientes

Instalación y configuración

  • Para instalarlo, basta con colocar el archivo lsix en una ruta como /usr/local/bin y ejecutarlo
  • lsix es un script de shell Bash
  • El único software requerido es ImageMagick
    • Ejemplo: apt-get install imagemagick
  • Los usuarios de macOS pueden usar brew install lsix
    • Si es necesario, también se instala ImageMagick
  • El diseño actual es muy simple
    • No tiene flags de línea de comandos
    • No tiene archivo de configuración
    • No tiene perillas de ajuste
  • Valores como el ancho de mosaico, la familia de fuentes y el tamaño en puntos se pueden cambiar modificando variables al inicio del archivo
    • La lista de fuentes instaladas se puede consultar con convert -list font

Requisitos de terminal con soporte Sixel

  • La terminal debe admitir gráficos Sixel
  • Se puede probar la terminal imprimiendo una sola imagen en Sixel
convert foo.jpg -geometry 800x480 sixel:-
  • Para el desarrollo se usó el modo de emulación vt340 de xterm
  • XTerm no tiene el modo Sixel activado por defecto
    • Al ejecutarlo, se puede usar xterm -ti vt340
    • O se puede agregar xterm*decTerminalID : vt340 a .Xresources y ejecutar xrdb -merge .Xresources
  • Algunas distribuciones, como Fedora, pueden compilar xterm sin soporte Sixel
    • En ese caso se puede probar una terminal alternativa como foot o mlterm

Terminales compatibles y no compatibles

  • Elementos confirmados o reportados como compatibles con Sixel
    • XTerm, MLterm, foot, Wezterm, Contour, iTerm2 for Apple MacOS y Yaft fueron probados
    • Konsole, yakuake, WSLtty for Microsoft Windows, MinTTY for Cygwin, compilaciones especiales de VTE, sixel-tmux y ttyd fueron reportados
  • Terminales no compatibles con Sixel
    • MacOS Terminal, kitty
    • Terminales estándar basadas en libvte
      • gnome-terminal
      • terminator
      • lxterm
    • Alacritty puede funcionar si se aplica el parche

Bugs y limitaciones conocidos

  • El modo reverse video de XTerm, xterm -rv, no es lo mismo que especificar explícitamente los colores de primer plano y de fondo
    • La especificación explícita puede detectarse, pero el recurso reverseVideo no, por lo que el color de fondo puede ser incorrecto
  • El ancho de pantalla de XTerm actualmente está limitado a 1000px
    • Cuando xterm pueda procesar imágenes más grandes que 1000x1000, se eliminará la limitación
    • La última prueba fue con XTerm(344)
  • Los nombres de archivo que empiezan con @ reciben un tratamiento especial en ImageMagick
    • Hay que anteponer el directorio, como en lsix ./@foo.png
    • Esto es un bug de ImageMagick, no de lsix
  • Si se especifica la cadena vacía "" como nombre de archivo, ImageMagick se detiene
    • Parece ser un bug o un comportamiento incorrecto de ImageMagick
  • El ajuste de línea en nombres de archivo largos funciona, pero no es inteligente
    • Todavía no se implementan saltos de línea basados en espacios, guiones, guiones bajos o puntos
  • Si se especifica un directorio en la línea de comandos, se trata como si el usuario hubiera hecho cd a ese directorio
    • El procesamiento recursivo no sería difícil, pero hay reticencia a agregar flags de línea de comandos a un script simple
  • Ejecutar lsix foo.avi puede causar problemas

Estándar Sixel y limitaciones de implementación

  • El estándar Sixel aparentemente no tiene una forma de consultar el tamaño de la pantalla gráfica
  • Según la documentación de VT340, el programa ya debe conocer la resolución del dispositivo de destino de renderizado
  • XTerm 344 agregó una secuencia de control que resuelve este problema: CSI ? Pi ; Pa ; Pv S
    • Algunas terminales, como mlterm, todavía no la implementan
  • Una alternativa es leer el tamaño de la ventana con la extensión dtterm WindowOps
    • No es una solución exacta, porque la geometría de la pantalla de gráficos Sixel y el tamaño de la ventana no necesariamente coinciden
    • Por ejemplo, xterm limita la geometría gráfica a 1000x1000 aunque la ventana sea más grande
  • Si ambos métodos fallan, lsix asume un entorno VT340
    • La resolución es 800x480
    • Considera que en una línea entran solo 6 mosaicos
  • El estándar Sixel tampoco ofrece una forma de consultar la cantidad de registros de color disponibles
    • lsix usa una extensión de xterm
    • Si la terminal no responde, asume un VT340 original y usa solo 16 registros de color

Por qué no usa libsixel

  • libsixel es un proyecto que genera comandos optimizados de gráficos Sixel
  • lsix usa Bash e ImageMagick en lugar de libsixel
    • Es una decisión para que funcione fácilmente en casi cualquier lugar, dado que Bash e ImageMagick están ampliamente disponibles
    • Mantiene el script simple para que los usuarios puedan modificarlo y extenderlo con facilidad
    • ImageMagick puede leer más formatos de entrada que stb_image, usado por img2sixel de libsixel
      • Por ejemplo: xpm, svg, png de 16 bits, archivos sixel
    • ImageMagick puede leer la entrada y escribir directamente la salida Sixel
    • libsixel puede ser más rápido, pero para mostrar un listado simple de directorio ImageMagick también es suficientemente rápido

Referencias

1 comentarios

 
GN⁺ 2024-06-08
Opiniones en Hacker News
  • Si, como yo, te cuesta usar la terminal sin tmux, la rama experimental de Sixel finalmente se fusionó hace unos 10 meses
    Ahora se puede compilar la rama principal de tmux con --enable-sixel y usar herramientas como lsix dentro de tmux
    Si quieres saber si tu terminal o multiplexor de terminal favorito soporta Sixel, puedes consultar el sitio "Are We Sixel Yet"
    https://github.com/tmux/tmux/commit/dfbc6b1888c110cf0ade66f2...
    https://www.arewesixelyet.com

    • Me cambié a Zellij hace unos años, y desde algún momento de 2022 uso bastante bien su soporte para Sixel
      Si quieres cambiar tu flujo de trabajo, creo que ofrece una experiencia mucho mejor que tmux tal como viene por defecto
      Incluye de serie funciones que antes habría agregado con plugins externos y scripts de configuración complejos, y la estabilidad y el rendimiento también me parecieron mucho mejores
      https://zellij.dev/
    • No termino de entender para qué sirve tmux
      ¿Puedes explicar por qué se vuelve una herramienta esencial en un flujo de trabajo, y por qué también podría serlo para el mío?
    • Pero ¿por qué hace falta? ¿Hay alguna razón para meter gráficos de píxeles a la fuerza en una cuadrícula de baja resolución basada en texto? ¿No sería mejor usar gráficos de píxeles directamente?
    • Uso tmux desde hace mucho, y antes usaba screen, pero no entiendo bien por qué Sixel marca una gran diferencia
      ¿Es un cambio como llevar un gestor de ventanas apiladas a tmux, comparado con el sistema actual de mosaicos? ¿O simplemente mejora los gráficos en la terminal? ¿Lo estoy entendiendo completamente mal?
      Si solo se trata de mejorar los gráficos, no veo bien por qué tmux tendría que soportarlo; me parece que lo importante sería el emulador de terminal, como Gnome Terminal. Quizás hagan falta ambos, pero yo pensaba que tmux solo tenía que dejarlo pasar
    • ¿Alguien sabe si al instalar tmux con brew queda Sixel activado?
  • La función que más me gusta de este repositorio es el directorio README.md.d
    Es una idea bastante buena, y creo que incluso se podría omitir el .md

    • La jugada realmente fuerte sería incrustar las imágenes tal cual en Sixel dentro del archivo README
      Así, con solo hacer cat README, las imágenes podrían verse directamente
  • Usa "\e[c" para detectar automáticamente si hay soporte para Sixel
    https://github.com/hackerb9/lsix/blob/3a431793a747df3f934051...
    "\e[c" significa "send device attributes"
    https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-F...

  • La idea está genial, pero no funciona en PuTTY/KiTTY
    Al ejecutar $ lsix, aparece un error diciendo que la terminal no informa soporte para gráficos Sixel, y recomienda usar una terminal con soporte para Sixel como xterm -ti vt340 o pedirle soporte al fabricante de la terminal
    Una imagen individual se puede probar con convert foo.jpg -geometry 800x480 sixel:-, y si se trata de una terminal que realmente lo soporta, indica reportar el bug en http://github.com/hackerb9/lsix/issues
    El código de atributos del dispositivo aparece como ^[[?6c
    Qué lástima. Habría estado bastante bueno. ¿Hay alguna terminal open source para Windows que soporte Sixel? La mayoría parecen estar orientadas a Cygwin o WSL, y no se ve mucho para Windows puro

    • Hace poco empecé a usar wezterm y me gusta bastante
      Es multiplataforma y soporta gráficos Sixel
      https://github.com/wez/wezterm
    • Mintty es una excelente terminal para Windows con soporte para Sixel
  • En una línea similar también está timg: https://github.com/hzeller/timg

  • iTerm2 para MacOS tiene una función similar incorporada, y además impone menos carga del lado del servidor
    En lugar de renderizar la imagen como Sixel en el servidor usando muchas bibliotecas de imágenes, codifica la imagen completa en base64, la envía al cliente, y el cliente determina el formato de imagen y la renderiza localmente en la terminal
    https://iterm2.com/documentation-images.html

    • konsole también implementó el mismo protocolo
      En Linux uso tal cual, sin modificaciones, el script imgcat
      Por supuesto es mucho más rápido que convertir con ImageMagick, pero de todos modos ya agregué lsix al directorio bin
  • Hay que tener cuidado al ejecutarlo en directorios no confiables
    En particular, las cosas que parsean imágenes, como PDF, pueden ser peligrosas igual que otras herramientas, y hay que tener aún más cuidado al usar ImageMagick

    • ¿Parsear imágenes no confiables es problemático en sí mismo?
      Si abres una carpeta de descargas no confiable con Gnome Files, y muestra —por lo tanto parsea— las imágenes que contiene, ¿es un tema de seguridad del que habría que preocuparse?
      Pensaba que cosas como JavaScript dentro de un PDF podían ser problemáticas, pero no creía que una simple vista previa también pudiera ser peligrosa
  • La terminal que uses debe soportar gráficos Sixel

    • Hice una biblioteca gráfica para terminales que no soportan Sixel
      https://github.com/dheera/python-termgraphics
      Podría ser interesante modificar esta biblioteca para soportarla como ruta alternativa
    • xterm soporta Sixel, así que configurar valores como TERM=xterm256-color debería ser compatible con todo… ¿verdad? tos gnome-terminal tos
    • mlterm funciona
  • fzf ofrece soporte experimental para imágenes Sixel en el panel de vista previa desde la versión 0.44.0
    No está disponible en Windows
    https://github.com/junegunn/fzf/releases/tag/0.44.0
    fzf --preview='fzf-preview.sh {}'

    • Como alternativa, se puede usar fzf --preview 'convert {} -geometry 800x480 sixel:-'
      Esto también requiere tener instalado ImageMagick