Você já viu aqueles GIFs que animam a linha de comando e se perguntou como eles ficam tão bonitos? Ou viu um pequeno GIF e se perguntou como eles são tão pequenos? Não é tão difícil quanto você imagina, e abordo ambos com dois comandos fáceis de usar.
VHS é um comando para gerar GIFs a partir de um arquivo de script e Gifsicle é um comando para editá-los. Quando usados juntos, eles podem criar GIFs altamente compactos e com aparência profissional. Abordo o que é VHS, como usá-lo e como compactar o GIF resultante para que fique um pouco maior que um arquivo PNG típico.
Uma demonstração de VHS
Dizem que uma imagem vale mais que mil palavras, então aqui está uma que é literalmente verdadeira neste caso:
Essa animação foi para um artigo que escrevi sobre fzf. Aqui está outra imagem do mesmo artigo:
Eles ficam lindos, não é? Acredite ou não, não foi difícil nem muito técnico, nem resultou em uma imagem grande e volumosa. Na verdade, a primeira imagem tem apenas 223 KB e a segunda é ainda menor, com 22 KB. Então, como eu fiz isso? Com VHS, Gifsicle e um pouco de feitiçaria.
Se ainda não o fez, leia como instalar e usar o fzf se pretende continuar.
Principais conceitos de VHS explicados
O conceito central por trás do VHS é o arquivo de fita – uma sequência de comandos de script que simula uma sessão de terminal. Aqui está um exemplo simples:
Output output.gif Type 'ls -al' Enter Sleep 2s
Esta fita em particular faz três coisas:
- Especifica um arquivo GIF de “Saída”.
- Simula a digitação de um comando (“Type”) e a seguir o pressionamento de “Enter”.
- “Dorme” por 2 segundos para permitir que o leitor processe as ações.
Ao executar esta fita, você verá o comando digitado no terminal e executado. A animação será repetida após uma breve pausa.
Gere o arquivo GIF executando vhs meu-arquivo.tape no seu terminal.
O GIF resultante:
Agora vamos escrever uma fita
Agora vamos escrever um exemplo mais complexo e focar em alguns detalhes.
Compreendendo o arquivo de fita
O arquivo de fita a seguir criará o GIF “agulha em um palheiro” visto anteriormente. Vou esclarecer o que cada linha significa abaixo.
Output unoptimized.gif Require fzf Set FontSize 32 Set Width 1200 Set Height 675 Set TypingSpeed 0.15 Set Shell "zsh" Set Framerate 5 Hide Type 'eval "$(fzf --zsh)"' Enter Type 'clear' Enter Show Type 'cat lorem.txt' Sleep 1 Enter Sleep 2s Type 'cat lorem.txt | fzf' Sleep 1 Enter Sleep 0.5 Type "needle" Sleep 1 Enter Sleep 3s
A diretiva “Require” garante que “fzf” esteja presente em seu sistema antes de continuar.
A diretiva “Output” não precisa de explicação, mas saiba que você pode renderizar em um GIF, MP4, WebM ou em um diretório de quadros individuais para processar separadamente.
As diretivas “Set” precisam ser especificadas a seguir – próximo ao topo do arquivo de fita. Eles aplicam várias opções, como “Largura”, “Altura”, “Shell”, “Taxa de quadros” e até mesmo “Velocidade de digitação”. Essas opções são autoexplicativas. Você pode alterar a velocidade de digitação em qualquer lugar do arquivo de fita, mas deve especificar todas as outras opções na parte superior.
Eu deliberadamente configurei a taxa de quadros baixa para reduzir o tamanho da imagem, mas às vezes isso pode causar problemas de renderização. Se for esse o caso, aumente o “Framerate” ou remova totalmente a diretiva.
A seção “Ocultar” é a próxima, e é aqui que fazemos a configuração do script. Adicionamos aqui quaisquer comandos que não queremos renderizados. Neste exemplo, configuramos o ambiente fzf e limpamos o terminal para remover quaisquer mensagens indesejadas de sua avaliação de shell. Terminamos a seção “Hide” com uma diretiva “Show”, que diz ao VHS para gravar o que se segue.
A linha 17 é onde começa a renderização visual. Primeiro, ele cria um arquivo preenchido com texto de Lorem Ipsum – este é o palheiro que pesquisaremos com fzf. O script “dorme” frequentemente porque faz com que a animação pareça melhor.
Na linha 22, colocamos o arquivo de texto novamente, canalizamos para fzf, pressionamos a tecla Enter e, na linha 22, finalmente digitamos o termo de pesquisa: agulha. Terminamos o script com um longo “Sleep” para dar ao usuário tempo para processar a imagem.
O comando inteiro deve cat um arquivo de texto para mostrar seu conteúdo, depois cat novamente e pesquisá-lo usando fzf.
Crie o arquivo de fita
Antes de gerar um GIF a partir do seu arquivo de fita, certifique-se de ter instalado o fzf. Você também precisa criar um arquivo de texto lorem ipsum – então execute o seguinte comando:
{ echo -e "You can use fzf to find a needle in a haystack.n"; curl 'https://pastebin.com/raw/nRc62E07'; } > lorem.txt
Agora, crie um arquivo de fita chamado fzf-demo.tape, insira o conteúdo do arquivo de fita e execute o seguinte comando para gerar o GIF:
vhs fzf-demo.tape
Esse comando produzirá um GIF chamado “unoptimized.gif”, que compactaremos na próxima seção.
Comprimir o GIF
O “unoptimized.gif” que criamos tem cerca de 1,2 MB, o que geralmente é muito grande. Podemos compactá-lo com um comando chamado Gifsicle. Você pode instalá-lo com os seguintes comandos:
Para o Fedora, execute o seguinte comando:
sudo dnf install gifsicle
Para Debian, execute o seguinte comando:
sudo apt install gifsicle
Para Arch Linux, execute o seguinte comando:
sudo pacman -S gifsicle
Agora que o Gifsicle está instalado, você pode compactar o arquivo “unoptimized.gif” com o seguinte comando:
gifsicle -O3 --colors 8 unoptimized.gif -o optimized.gif
Isso compactará o GIF para aproximadamente 228 KB.
Em vez de usar uma paleta de cores completa, optei por oito bits. Depois da redução da resolução, a redução do número de cores é a maior economia de espaço. Se a sua sessão de terminal contém uma ampla gama de cores que você deseja preservar, defina um valor mais alto, até 256, mas esteja preparado para um arquivo significativamente maior.
Outra forma de reduzir o tamanho da imagem é reduzir a taxa de quadros. Eu configurei para 5, o que parece ser um bom equilíbrio entre compactação e legibilidade. Como a taxa de quadros é muito baixa, o GIF de saída conterá quadros duplicados, mas podemos removê-los automaticamente. Ao usar o sinalizador “-O3” (ou -O2) com Gifsicle, ele encontrará os quadros duplicados, removerá os extras e adicionará um atraso apropriado ao quadro restante.
"';
Se você comparar essas duas imagens antes e depois, poderá ver que uma imagem tem muito menos quadros e o atraso entre cada quadro mudou para uma taxa variável – essa é a imagem otimizada.
Para GIFs cheios de ação (por exemplo, texto que muda rapidamente), a remoção de quadros duplicados tem um impacto significativo no tamanho do arquivo. Para animações menores e mais simples, o espaço economizado é proporcionalmente menor, mas ainda assim considerável.
Não mencionei isso antes, mas o VHS possui um comando de gravação que criará automaticamente uma fita a partir das ações do seu terminal. Espera-se que você edite a fita depois. Executar registro vhs > my.tapeexecute suas ações e digite saída em seu shell quando terminar. Parece que você sairá do shell, mas não sairá; O VHS criará um arquivo de fita para você.
Eu recomendo que você leia a documentação oficial (encontrada na página do GitHub). Entenda que o VHS não é perfeito e pode haver bugs. No entanto, funciona na maioria das vezes e dá muito menos trabalho do que a gravação de tela. Você não acha? Experimente o recurso “gravar”, edite o arquivo de fita e execute os dois comandos necessários.