ccat – colorful cat: lendo arquivos com syntax highlighting no terminal

Rodando ccat
Tempo de leitura:4 minuto(s)

Eu fico muito no terminal (a.k.a “linha de comando”, ou ainda “Console”), é onde eu faço a maior parte das minha operações de interação com o código. Quando estou no Linux, até a escrita do código, feita com Vim, é feita no terminal (não uso o GVim, mas o Vim de modo texto). Commit no git, busca por arquivos, verificando qual porta está aberta, ou qual processo está fazendo o quê, faço tudo no terminal.

No entanto, uma coisa me incomodava. A exibição de arquivos, feita normalmente com cat (que no PowerShell é alias pra Get-Content), sempre exibe o texto sem cor alguma.

Fica feio (clique nas imagens para ampliar):

cat simples

Pois bem, resolvi que isso era algo que eu precisava melhorar. E consegui. Aqui você pode ver o resultado final com um arquivo de TypeScript do que eu chamei de ccat (ou colorful cat):

cat com TypeScript

Note que a leitura fica muito melhor, comentários aparecem em verde, strings em vermelho, palavras chave aparecem em azul, tipos em azul claro, e por aí vai. E ele é esperto o suficiente pra entender sozinho a linguagem. Aqui com C#:

cat com C#

Aqui com F#:

cat com F#

Aqui com VB:

cat com VB

Aqui com Go:

cat com Go

E mais de cem outras linguagens.

Implementando a solução

A solução é super simples, ela é baseada em Pygments, que é uma biblioteca muito conhecida por quem trabalha com Python, e que também oferece uma ferramenta de linha de comando (CLI) chamada pygmentize. Então, a primeira coisa é garantir que você tem o Python instalado.

Disclamer: vou rapidamente aqui tentar te ajudar a instalar o Python e ferramentas auxiliares. Se você está no Linux é bem provável que já tem diversas delas. De toda forma, estou aqui apenas dando uma introdução rápida, que, com sorte, vai funcionar. Mas pode ser que você tenha alguma dificuldade, aí sugiro buscar nos próprios guias de instalação de cada ferramenta.

Digite python --version no terminal, e verifique se você recebe uma resposta com o número da versão, se receber um erro, instale o Python. No Windows, com Chocolatey, rode cinst -y python2-x86_32 (costumo usar o Python 2 de 32 bits). No Linux, com apt, digite apt install -y python. Ou baixe e rode o instalador.

Você também precisa do pip, que é o gestor de pacotes do Python. Digite pip --version pra garantir que você o tem disponível. Se não tiver, instale, aqui tem um tutorial, mas o mais fácil é baixar o get-pip.py e rodar python get-pip.py no diretório onde você o baixou. É importante verificar se o pip foi colocado na sua linha de comando, abra um novo terminal e confirme. No Windows, normalmente ele não é colocado, no Linux é. Ele normalmente fica no diretório Scripts ao lado de onde o Python fica instalado, você o acha fácil digitando, no PowerShell: ls "$($(ls $(gcm python).Source).Directory.FullName)\Scripts\".

Aí basta instalar o pygments com o Pip, com pip install –user pygments.

Após instalado, a ferramenta pygmentize vai estar disponível:

Pygmentize rodando

Note na imagem acima que o resultado é um pouco diferente da imagem anterior, ambas exibindo o mesmo arquivo. Isso é porque estou usando algumas opções mais avançadas. Se você rodar ele com pygmentize.exe -g -O style=vs -f console16m, o resultado é o mesmo. Veja na documentação do Pygments o que cada opção significa. Basicamente estou usando o estilo “vs” e um formatter pra console de 16 milhões de cores. Veja aqui como fica cada estilo.

Então, basta criar um alias. No Linux é simples, basta colocar essa linha no inicializador do seu profile:

alias ccat='pygmentize.exe -g -O style=vs -f console16m'

No Windows é mais complicado, o PowerShell tem um comando de alias chamado Set-Alias, mas ele não permite o uso de argumentos pra funções. Eu já tinha tido esse problema no passado, então criei o Add-Alias, e ficou assim:

Add-Alias ccat "pygmentize.exe -g -O style=vs -f console16m"

O Add-Alias está na PowerShell Gallery, e você pode ver o código no Github. Pra instalar basta rodar:

Install-Module -Name posh-alias

Se quiser ver como ficou tudo amarrado, basta olhar meus arquivos de profile do PowerShell no Github, especialmente o arquivo que configura o profile.

Encontrei diversas maneiras de fazer isso na web, o que escrevi acima foi um resumo da minha implementação. Há outras formas de fazer. Por exemplo, já há um projeto que faz o mesmo no Github, feito em Go. O processo de busca faz parte da diversão, se achou que tem um jeito melhor, muito bom, procure e conte pra gente como foi. Curtiu a solução? Conseguiu fazer aí do seu lado? Achou que foi útil?

Autor: Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador.
Programa porque gosta, e começou a trabalhar com isso porque acha que trabalhar como administrador é meio chato. Por esse motivo sempre diz que nunca mais vai virar gerente de ninguém. E também porque acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é melhor que hierarquia. Mas isso é outro assunto.
Foi reconhecido  Microsoft MVP depois que alguém notou que ele não dormia a noite pra ficar escrevendo artigos, cuidando e participando do .Net Architects, gravando o podcast Tecnoretórica, escrevendo posts no blog e falando o que bem entende no twitter @giovannibassi. E por falar nisso é no twitter que conta pra todos que gerencia de projetos deve ser feita pelo time e não por um gerentes, que greves em TI são coisas sem sentido e que stored procedure com regras de negócio são malígnas.
Você já deve ter percebido (até porque está lá na primeira frase) que Giovanni é agilista. De tanto gostar disso ele trouxe os programas de certificação e treinamento  PSD e PSM da Scrum.org pro Brasil, e por causa deles, do MVP e de algum trabalho que aparece tem que ficar indo pros EUA de vez enquando, coisa que prefere não fazer. (É bem comum você ouvir ele perguntando porque a Scrum.org e a Microsoft não estão na Itália, por exemplo.)
Junto com alguns Jedis criou a Lambda3, que, apesar de ser pequena e de não ser muito comum no Brasil, insiste em fazer projetos e consultoria direito. Por causa da Lambda3 ele tem trabalhado mais do que quando era consultor independente, mas menos do que a maioria das pessoas. Quer dizer, isso se você considerar que os trabalhos junto à comunidade não são trabalho, caso contrário ele trabalha mais que a maioria das pessoas.
Recentemente ele resolveu que merecia viver melhor e ganhar uns anos de vida e desistiu de ser sedentário, fazendo algum barulho de vez em quando com os amigos no twitter com a hashtag #DotNetEmForma. Por causa do convite recente de amigos do lado Open Source (que ele respeita e admira), começou a escalar, e agora está sempre com as mãos machucadas. Mas ainda dá pra programar. Você encontra ele sempre em algum evento, como o TechEd, e o DNAD, mas também outros menos comuns para o pessoal do .NET, como a RubyConf. Nesses eventos, ou ele está vendo palestras, ou batendo papo com alguém, ou codando alguma aplicação que alguém achou que dava pra fazer durante o evento.