O Comando Linux CCWC

(English version)
Um GIF de um terminal Linux com o background preto e o texto verde.

Ah, nada como refazer o comando Linux wc numa sexta-feira à noite.

Usando Python. Aí sim, estamos falando de vida boa.

Usando Vim, vish.

Esse post é um compilado das minhas alegrias e tragédias nesta empreitada.

Por falar em tragédia, vamos começar pelo meu Romeu e Julieta.

Vim

Cara, usar o Vim é difícil. É tão difícil que chega a doer. Como algo no mundo virtual pode causar dor física? Eu me faço essa pergunta todos os dias.

Antes de continuar, um pouco de contexto: o Vim é um editor de texto lançado nos anos 90, bastante popular entre programadores, usuários Linux e... sofredores. Ele é altamente configurável e tem inúmeros atalhos, além de habilitar algo bastante poderoso chamado Vim Motions.

As Vim Motions são como você se movimenta no Vim, permitindo mover o cursor com velocidade e precisão. E sim, é um recurso incrível, porém a curva de aprendizado é colossal. Perdi a conta de quantas vezes desisti de usar o Vim.

Mas existia uma voz na minha mente que falava: "Você vai deixar um editor de texto dos anos 90 te derrotar? Sério? Que patético!"

Juntei meus pedaços de coragem que estavam espalhados pelo chão e fui para a batalha.

“Vamos lá, hora de programar alguma coisa com o Vim.”

CodingChallenges

Sempre quis fazer algum desafio do CodingChallenges, uma série de desafios de programação criado pelo John Crickett que ajudam os desenvolvedores a praticarem programação. A proposta é simples: recriar ferramentas existentes no mundo real.

O que mais gosto nos desafios é a liberdade. Você escolhe como resolver seguindo seu próprio estilo, bem diferente de um Tutorial Hell.

O primeiro desafio é recriar o comando Linux wc (word count), que conta palavras, linhas, caracteres e o tamanho de arquivos de texto ou da entrada padrão.

Nossa versão do wc será chamada de ccwc.

CCWC

Bom, vamos lá. A ideia inicial era conseguir executar o comando ccwc de qualquer pasta do sistema operacional e receber apenas um print com "Hello World".

Logo de início, aprendi sobre o shebang, aqueles dois caracteres #! no início de um script, seguido do caminho do interpretador necessário para rodar o script, no meu caso, o Python.

Minha shebang ficou assim:

#!/usr/bin/env python3

Com o sistema operacional já configurado para executar o script, o próximo passo é tornar o ccwc um comando reconhecido em qualquer lugar do sistema. Para isso, precisamos adicioná-lo ao PATH da máquina.

No Linux, existe uma pasta específica para scripts criados por usuários: /usr/local/bin. Basta criar um link simbólico (um atalho) do script para essa pasta, usando o seguinte comando:

sudo ln -s script/path /usr/local/bin/ccwc

Show. Agora conseguimos executar nosso script de qualquer lugar no sistema operacional, e ele já sabe que deve ser rodado com Python.

Mas como fazemos para capturar os argumentos passados para o script?

Argparse

O argparse é um módulo Python específico para capturar os argumentos em linha de comando. Ele permite definir os argumentos necessários e adicionar descrições sobre o que cada um faz.

Se quiser ver os detalhes de como implementei isso, confira meu código no GitHub.

Nesse ponto, meus dedos já estavam "sangrando", não pela dificuldade do código, mas por causa do Vim. Alternar entre os modos insert e normal, combinado com a movimentação nada intuitiva, transformou uma tarefa simples em algo complicado.

Foi então que resolvi organizar as pastas de maneira mais lógica, para navegar de forma simples.

Organização de Pastas

A ideia dessa organização foi dividir os arquivos em responsabilidades pequenas e bem definidas. Assim, criei três arquivos principais:

  • cli.py: responsável exclusivamente por capturar os argumentos.
  • helper.py: contém as funções específicas para lidar com cada argumento.
  • ccwc.py: atua como o orquestrador principal do programa.

Além disso, criei um arquivo separado para os testes, utilizando o módulo unittest.

Poderia ter dividido ainda mais os arquivos, mas acredito que a simplicidade e a facilidade de modificação do código são muito mais importantes.

Um código simples é bem mais fácil de entender e ajustar por outro desenvolvedor que venha a trabalhar nele.

De complexo, já basta o Vim. E por falar em Vim...

Um pouco de alegria

Depois que a dificuldade inicial do Vim passa, você é recompensado com mais dificuldade. Porém, curiosamente, você acaba gostando de usá-lo.

Nada é mais satisfatório do que executar um "combo" de atalhos e fazer várias modificações no seu código. Por mais estranho que pareça, você sente um prazer em fazer isso.

Sim, faço parte dos usuários sofredores de Vim.

Não me entenda mal, para mim ainda é bem difícil de usar, mas ao mesmo tempo é bastante viciante.

Considerações Finais

O restante do código foi desenvolvido de forma bastante intuitiva. Se quiser conferir com mais calma, o projeto está disponível no meu GitHub — sinta-se à vontade para sugerir melhorias.

No geral, gostei bastante desse desafio. Levei cerca de dois dias para concluí-lo e já planejo fazer outros. Até a próxima!