- 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
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-sixele usar ferramentas comolsixdentro do tmuxSe 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
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/
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?
É 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
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
.mdAssim, só com
cat README, as imagens já poderiam aparecer como estãoEle usa
"\e[c"para detectar automaticamente o suporte a Sixelhttps://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, comoxterm -ti vt340, ou pedir suporte ao autor do terminalDá 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/issuesO código de atributos do dispositivo aparece como
^[[?6cUma 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
É multiplataforma e oferece suporte a gráficos Sixel
https://github.com/wez/wezterm
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
No Linux, estou usando o script
imgcatsem modificaçõesNaturalmente é muito mais rápido do que converter com ImageMagick, mas por enquanto também adicionei o
lsixao diretóriobinÉ 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
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
https://github.com/dheera/python-termgraphics
Pode ser interessante modificar essa biblioteca para oferecer suporte como caminho alternativo
TERM=xterm256-colordeve ser compatível… certo? cof gnome-terminal cofO 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 {}'fzf --preview 'convert {} -geometry 800x480 sixel:-'Isso também exige que o ImageMagick esteja instalado