4 pontos por GN⁺ 2024-06-08 | 1 comentários | Compartilhar no WhatsApp
  • lsix é um script Bash que, como o ls, mostra imagens como miniaturas dentro do terminal para o diretório atual ou para uma lista de arquivos especificada, usando gráficos Sixel na saída
  • Usa o ImageMagick para lidar com vários formatos de imagem e, quando um GIF ou um arquivo com várias imagens é especificado na linha de comando, expande os quadros e exibe uma montagem
  • Detecta se o terminal oferece suporte a Sixel, as cores de primeiro plano e fundo, se é possível expandir os registradores de cores e a largura da janela, ajustando a qualidade e a disposição das miniaturas
  • Para instalar, basta colocar o arquivo lsix em um diretório do PATH e ter o ImageMagick disponível; no macOS, é possível instalar junto com o ImageMagick usando brew install lsix
  • O XTerm vem com o modo Sixel desativado por padrão e alguns terminais não são compatíveis, então é preciso verificar antes se o terminal é compatível com Sixel

Ferramenta de listagem de imagens no terminal, usada como ls

  • lsix é uma ferramenta próxima de um ls para imagens, exibindo miniaturas de arquivos inline no terminal
  • O modo básico de execução é simples
    • ao digitar apenas lsix, ele mostra as imagens do diretório de trabalho atual
    • é possível especificar nomes de arquivos no formato lsix [ FILES ... ]
    • curingas do shell podem ser usados, permitindo execuções como lsix *jpg * png
  • A saída usa gráficos Sixel

Processamento de formatos e forma de exibição com base no ImageMagick

  • Como usa ImageMagick, oferece suporte a diversos formatos de imagem
  • Formatos que podem ser lentos para renderizar, como PDF, não são exibidos a menos que sejam solicitados explicitamente
    • para listar um formato específico à força, especifique o nome do arquivo diretamente ou use curingas como *.pdf
  • Se um GIF ou arquivo com várias imagens for especificado na linha de comando, todos os quadros serão expandidos e mostrados em uma montagem
    • em GIFs, alguns quadros podem armazenar apenas os pixels alterados em relação ao quadro anterior
  • Gráficos não bitmap também podem funcionar
    • ex.: .svg, .eps, .pdf, .xcf

Recursos de detecção do ambiente do terminal

  • O lsix usa sequências de controle para detectar se o terminal pode exibir gráficos Sixel inline
  • O canal alfa de PNG e SVG é tratado de acordo com a cor de fundo do terminal
    • o lsix tenta descobrir as cores de primeiro plano e fundo por meio de sequências de escape do terminal
    • a cor de primeiro plano é usada para o preenchimento de texto
  • Se detectar terminais como o xterm, capazes de aumentar o número de registradores de cores, ele expande isso automaticamente para melhorar a qualidade da imagem
  • Em terminais com suporte a dtterm WindowOps, ajusta a quantidade de tiles por linha conforme a largura da janela
  • Quando há muitas imagens no diretório, evita esperar pela geração da montagem completa
    • se houver mais de 21 imagens, exibe uma linha por vez
  • Se os nomes de arquivo forem longos demais, quebra o texto em várias linhas antes de passá-lo ao montage do ImageMagick
    • ao usar montage sem o lsix, nomes de arquivo longos podem se sobrepor
  • Nomes de arquivo em Unicode funcionam se a fonte usada tiver os glifos necessários

Forma de instalação e configuração

  • Para instalar, basta colocar o arquivo lsix em um caminho como /usr/local/bin e executá-lo
  • O lsix é um script de shell Bash
  • O único software obrigatório é o ImageMagick
    • ex.: apt-get install imagemagick
  • Usuários de macOS podem usar brew install lsix
    • se necessário, o ImageMagick também é instalado junto
  • O design atual é extremamente simples
    • sem flags de linha de comando
    • sem arquivo de configuração
    • sem controles de ajuste
  • Valores como largura dos tiles, família da fonte e tamanho em pontos podem ser alterados modificando variáveis no topo do arquivo
    • a lista de fontes instaladas pode ser consultada com convert -list font

Requisitos de terminais com suporte a Sixel

  • O terminal precisa oferecer suporte a gráficos Sixel
  • É possível testar o terminal exibindo uma única imagem em Sixel
convert foo.jpg -geometry 800x480 sixel:-
  • O desenvolvimento foi feito usando o modo de emulação vt340 do xterm
  • O XTerm não vem com o modo Sixel ativado por padrão
    • ao iniciar, é possível usar xterm -ti vt340
    • ou adicionar xterm*decTerminalID : vt340 ao .Xresources e executar xrdb -merge .Xresources
  • Algumas distribuições, como Fedora, podem compilar o xterm sem suporte a Sixel
    • nesse caso, pode-se tentar terminais alternativos como foot ou mlterm

Terminais compatíveis e incompatíveis

  • Terminais confirmados ou relatados como compatíveis com Sixel
    • XTerm, MLterm, foot, Wezterm, Contour, iTerm2 for Apple MacOS e Yaft foram testados
    • Konsole, yakuake, WSLtty for Microsoft Windows, MinTTY for Cygwin, compilação especial do VTE, sixel-tmux e ttyd foram relatados
  • Terminais incompatíveis com Sixel
    • MacOS Terminal, kitty
    • terminais baseados no libvte padrão
      • gnome-terminal
      • terminator
      • lxterm
    • o Alacritty pode funcionar com um patch

Bugs e limitações conhecidos

  • O modo reverse video do XTerm, xterm -rv, é diferente de definir explicitamente as cores de primeiro plano e fundo
    • a definição explícita pode ser detectada, mas o recurso reverseVideo não pode, então a cor de fundo pode ficar incorreta
  • A largura da tela no XTerm está atualmente limitada a 1000px
    • a limitação será removida quando o xterm puder processar imagens maiores que 1000x1000
    • o último teste foi feito com base no XTerm(344)
  • Nomes de arquivo que começam com @ recebem tratamento especial no ImageMagick
    • é preciso prefixar o diretório, como em lsix ./@foo.png
    • isso é um bug do ImageMagick, não do lsix
  • Se uma string vazia "" for especificada como nome de arquivo, o ImageMagick trava
    • isso parece ser um bug ou comportamento incorreto do ImageMagick
  • A quebra de linha em nomes de arquivo longos funciona, mas não é inteligente
    • ainda não há implementação para quebrar por espaços, hífens, underscores ou pontos
  • Se um diretório for especificado na linha de comando, ele será tratado como se o usuário tivesse feito cd para esse diretório
    • o processamento recursivo não é difícil, mas há resistência em adicionar flags de linha de comando a um script simples
  • Executar lsix foo.avi pode causar problemas

O padrão Sixel e limitações de implementação

  • O padrão Sixel aparentemente não oferece uma forma de consultar o tamanho da área gráfica
  • Com base na documentação do VT340, o programa já precisa conhecer a resolução do dispositivo de renderização
  • O XTerm 344 adiciona a sequência de controle CSI ? Pi ; Pa ; Pv S para resolver esse problema
    • alguns terminais, como o mlterm, ainda não a implementam
  • Existe uma alternativa para ler o tamanho da janela via extensão dtterm WindowOps
    • a geometria da tela gráfica Sixel e o tamanho da janela não são necessariamente iguais, então não é uma solução exata
    • por exemplo, o xterm limita a geometria gráfica a 1000x1000 mesmo quando a janela é maior
  • Se os dois métodos falharem, o lsix assume um ambiente VT340
    • resolução de 800x480
    • considera que cabem apenas 6 tiles por linha
  • O padrão Sixel também não oferece um meio de consultar quantos registradores de cores estão disponíveis
    • o lsix usa extensões do xterm
    • se o terminal não responder, assume o VT340 original e usa apenas 16 registradores de cores

Por que não usar libsixel

  • libsixel é um projeto que gera comandos gráficos Sixel otimizados
  • O lsix usa Bash e ImageMagick em vez de libsixel
    • foi uma escolha para funcionar facilmente em qualquer lugar onde Bash e ImageMagick estejam amplamente disponíveis
    • mantém o script simples para que os usuários possam modificá-lo e expandi-lo com facilidade
    • o ImageMagick consegue ler mais formatos de entrada do que o stb_image usado pelo img2sixel do libsixel
      • ex.: xpm, svg, 16-bit png, arquivos sixel
    • o ImageMagick pode ler a entrada e escrever a saída em Sixel diretamente
    • o libsixel pode ser mais rápido, mas, para uma simples listagem de diretório, o ImageMagick também é rápido o suficiente

Materiais de referência

1 comentários

 
GN⁺ 2024-06-08
Opiniões no Hacker News
  • Se, como eu, é difícil usar o terminal sem tmux, o branch experimental de Sixel finalmente foi mesclado há cerca de 10 meses
    Agora dá para compilar o tmux mainline com --enable-sixel e usar ferramentas como lsix dentro do tmux
    Se quiser saber se seu terminal ou multiplexador de terminal favorito tem suporte a Sixel, veja o site "Are We Sixel Yet"
    https://github.com/tmux/tmux/commit/dfbc6b1888c110cf0ade66f2...
    https://www.arewesixelyet.com

    • Migrei para o Zellij há alguns anos e uso bem o suporte a Sixel desde algum momento de 2022
      Se você quer mudar seu fluxo de trabalho, acho que a experiência padrão é muito melhor que a do tmux
      Funcionalidades que normalmente eu teria adicionado com plugins externos e scripts de configuração complexos já vêm incluídas por padrão, e a estabilidade e o desempenho também foram bem melhores
      https://zellij.dev/
    • Não entendo bem para que serve o tmux
      Você poderia explicar por que ele vira uma ferramenta essencial no fluxo de trabalho e por que também poderia ser essencial para o meu trabalho?
    • Mas por que isso é necessário? Há algum motivo para enfiar gráficos em pixels em uma grade de baixa resolução baseada em texto? Não seria só usar gráficos em pixels?
    • Uso tmux há muito tempo e antes usava screen, mas não entendo bem por que Sixel faz tanta diferença
      É uma mudança do tipo trazer um gerenciador de janelas empilhadas para o tmux, em comparação com o modelo de tiling atual? Ou é só uma melhoria nos gráficos do terminal? Estou entendendo tudo errado?
      Se for apenas uma melhoria gráfica, não entendo muito bem por que o tmux precisa oferecer suporte; parece que o lado do emulador de terminal, como o Gnome Terminal, seria o mais importante. Talvez ambos sejam necessários, mas eu achava que o tmux só precisaria repassar isso
    • Alguém sabe se, ao instalar tmux com brew, o Sixel fica ativado?
  • O recurso de que mais gosto neste repositório é o diretório README.md.d
    É uma ideia bem boa, e acho que daria até para remover o .md

    • A jogada realmente forte é embutir as imagens diretamente em Sixel dentro do arquivo README
      Assim, só com cat README, as imagens já poderiam aparecer como estão
  • Ele usa "\e[c" para detectar automaticamente o suporte a Sixel
    https://github.com/hackerb9/lsix/blob/3a431793a747df3f934051...
    "\e[c" é "send device attributes"
    https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-F...

  • A ideia é legal, mas não funciona no PuTTY/KiTTY
    Ao executar $ lsix, aparece um erro dizendo que o terminal não informa suporte a gráficos Sixel e sugerindo usar um terminal com suporte a Sixel, como xterm -ti vt340, ou pedir suporte ao autor do terminal
    Dá para testar uma imagem única com convert foo.jpg -geometry 800x480 sixel:-; se o terminal realmente tiver suporte, a mensagem orienta relatar o bug em http://github.com/hackerb9/lsix/issues
    O código de atributos do dispositivo aparece como ^[[?6c
    Uma pena. Teria sido bem bacana. Existe algum terminal Windows open source com suporte a Sixel? A maioria parece ser voltada a Cygwin ou WSL, e quase não vejo opções para Windows puro

    • Comecei a usar wezterm recentemente e estou gostando bastante
      É multiplataforma e oferece suporte a gráficos Sixel
      https://github.com/wez/wezterm
    • Mintty é um excelente terminal Windows com suporte a Sixel
  • Na mesma linha, também existe o timg: https://github.com/hzeller/timg

  • O iTerm2 para MacOS tem um recurso parecido embutido, com menos carga no lado do servidor
    Em vez de renderizar a imagem como Sixel no servidor usando várias bibliotecas de imagem, ele codifica a imagem inteira em base64 e a envia ao cliente, e o cliente identifica o formato da imagem e a renderiza localmente no terminal
    https://iterm2.com/documentation-images.html

    • O konsole também implementou o mesmo protocolo
      No Linux, estou usando o script imgcat sem modificações
      Naturalmente é muito mais rápido do que converter com ImageMagick, mas por enquanto também adicionei o lsix ao diretório bin
  • É preciso ter cuidado ao executar em diretórios não confiáveis
    Especialmente coisas que fazem parsing de imagens, como PDFs, podem ser perigosas como qualquer outra ferramenta, e é preciso ainda mais cuidado ao usar ImageMagick

    • Fazer parsing de imagens não confiáveis é um problema por natureza?
      Se eu abrir uma pasta de downloads não confiável no Gnome Files e ele exibir, portanto fizer parsing, das imagens dentro dela, isso é uma questão de segurança com a qual devo me preocupar?
      Eu achava que coisas como JavaScript dentro de PDFs poderiam ser problemáticas, mas não imaginava que uma simples pré-visualização também pudesse ser perigosa
  • O terminal usado precisa oferecer suporte a gráficos Sixel

    • Criei uma biblioteca gráfica para terminais que não dão suporte a Sixel
      https://github.com/dheera/python-termgraphics
      Pode ser interessante modificar essa biblioteca para oferecer suporte como caminho alternativo
    • O xterm tem suporte a Sixel, então qualquer configuração com valores como TERM=xterm256-color deve ser compatível… certo? cof gnome-terminal cof
    • mlterm funciona
  • O fzf oferece suporte experimental a imagens Sixel na janela de pré-visualização desde a versão 0.44.0
    Não pode ser usado no Windows
    https://github.com/junegunn/fzf/releases/tag/0.44.0
    fzf --preview='fzf-preview.sh {}'

    • Como alternativa, dá para usar fzf --preview 'convert {} -geometry 800x480 sixel:-'
      Isso também exige que o ImageMagick esteja instalado