Back-End

11 jan, 2017

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

Publicidade

Eu fico muito no terminal (a.k.a “linha de comando”, ou ainda “Console”), que é 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, olha:

lambda01

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):

lambda02

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#:

lambda03

Aqui com F#:

lambda04

Aqui com VB:

lambda05

Aqui com Go:

lambda06

E mais de cem outras linguagens.

Implementando a solução

A solução é super simples e 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á tenha 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; para isso, abra um novo terminal e confirme. No Windows, normalmente ele não é colocado, já 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:

lambda07

Note, na imagem acima, que o resultado é um pouco diferente da imagem anterior. Aqui ambas exibem o mesmo arquivo, mas isso aconteceu 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, mas 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, então, se acha que tem um jeito melhor, procure e conte pra gente!

Curtiu a solução? Conseguiu fazer aí do seu lado? Achou que foi útil?

***

Este artigo foi produzido em parceria com a Lambda3. Leia outros conteúdos no blog da empresa: blog.lambda3.com.br