Seu terminal pode ser muito, muito mais produtivo

Que tal reduzir drasticamente o tempo gasto em tarefas rotineiras? 😉

Nosso objetivo

Um terminal que praticamente preveja o que você vai digitar, te economize vários comandos repetitivos (como o git status), te dê um autocomplete absurdo, te permita achar um arquivo com CTRL+T que nem no seu editor/IDE preferido e que ainda tenha um visual lindo!

Te incentivo fortemente a testar você mesmo para ver o poder disso! :D

Os prints abaixo terão aparência diferente do vídeo acima porque criei uma vm limpa (ou quase, mudei o tema rsrs) de uma recém-instalada spin do Fedora, para garantir que não esqueceria de nada.

Apesar de ter sido feito originalmente no Fedora, em teoria este artigo deverá funcionar em qualquer distro Linux (se abusar até no MacOS)..

Update: o Marc Pires e o Beto Alves me confirmaram que funciona no MacOS (aqui e aqui, respectivamente) também! 😆


Por favor, não se preocupe com nomes de ferramentas/conceitos que talvez você ainda não tenha ouvido falar, apenas vá acompanhando “a lógica da coisa” e verá que é simples 🙂


Começando

1°) ZSH. Por hora, tudo o que você precisa saber sobre ele é que ele é um interpretador de comandos (shell) absurdamente personalizável (e que nos permitirá chegar ao resultado desejado).

Em todos sistemas que usei/testei, o pacote para ele se chama zsh mesmo, então basta instalá-lo com o gerenciador de pacote do seu sistema:

Fedora: dnf install zsh
Arch: yaourt -S zsh
*SUSE: zypper in zsh
Ubuntu: apt install zsh
*BSD: pkg install zsh bash

2°) Oh My Zsh: basicamente vai pré-configurar o ZSH por você (no processo ele irá solicitar sua senha, mas é apenas para configurar o ZSH como seu shell padrão):

curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh; zsh

Você deverá estar vendo essa tela agora:

Se não aparecer a mensagem “Shell changed.” logo antes da logo como na tela acima, pode ser que o script não tenha conseguido alterar seu shell ou talvez tivesse um erro na senha; nesse caso, basta você mesmo alterá-lo:

sudo usermod --shell $(which zsh) <seu_usuario>

Detalhe, isso vai valer para as próximas sessões. Caso não queira parar e fechar tudo o que está fazendo por conta de fazer logout/login novamente, basta executar zsh no seu terminal caso ele não entre diretamente nesse shell acima (ao abrir uma nova aba ou instância do terminal, por exemplo).

Ok, agora você já tem um autocomplete absurdo! Experimente digitar git <comando> (ou algum outra coisa que você costuma usar no dia-a-dia) e apertar <TAB> duas vezes para ver a lista de opções disponíveis:

Sugestões do autocomplete para configurações do git

Se de alguma forma o comando/programa que você tiver tentado não tiver oferecido muitas sugestões, provavelmente o Oh My Zsh terá um plugin para ele.

Para habilitar um plugin (tanto os desse link acima quanto os que veremos mais abaixo), basta adicionar o nome dele na linha “plugins” do arquivo “.zshrc” que foi criado em sua pasta pessoal (“~/.zshrc”). Por exemplo, para habilitar o plugin “dnf”:

Basta adicionar nessa array (?) “plugins”, por volta da linha 61

A partir de agora vamos partir para duas vertentes: a parte funcional e a parte visual. Em ambas, se quiser ver a feature recém-adicionada funcionado, basta fechar o terminal e abri-lo novamente ou abrir uma nova aba em seu terminal.


Funcional — vamos colocar (muito) mais recursos nele!

1°) zsh-syntax-highlighting: basicamente vai deixar o comando verde se tiver sido digitado corretamente, ou do contrário, vermelho. E ao digitar um caminho, ele ficará sublinhado caso o arquivo/diretório existir.

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting 

Daí adicione zsh-syntax-highlighting na lista de plugins do seu “~/.zshrc”

Note a linha 64

Daí você terá algo como isto:

Comando inválido em vermelho, válido em verde, caminhos existentes com sublinhado e strings em laranja

2°) zsh-autosuggestions: vai sugerir comandos baseados no seu histórico.

git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions

Daí adicione zsh-autosuggestions na lista de plugins do seu “~/.zshrc”:

Note a linha 65

A partir de agora ele vai sugerir comandos baseados em seu histórico:

Basta usar Ctrl+→ (direita) para aceitar a próxima palavra ou simplesmente → para o comando completo

3°) fzf: um fuzzy finder (buscador de arquivos) direto no terminal!!

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf && ~/.fzf/install

Lembre-se de responder “y” para as questões que serão feitas!

Tela de pós-instalação do fzf

Pronto, agora você poderá usar Ctrl+T quando precisar procurar por arquivos, que nem você faria no seu editor:

Experimente entrar em alguma pasta sua e procurar por algo!

Sugestão (opcional): habilite o suporte ao .gitignore para filtrar os arquivos e acelerar (muito) a busca 😜

Ah, e um adicional: similar à busca por arquivos, agora você poderá procurar comandos no histórico também, com Ctrl+R!

Nem precisa ser o termo exato: por exemplo, se digitar “gt” ele já encontra os “git” \o/

Visual — que tal um terminal sexy?

UPDATE: O canal baby Wogue fez um vídeo recentemente que resume bem essa parte!

1°) Nerd Fonts: um “agregador de fontes icônicas”, com algumas fontes monoespaçadas alteradas para suportar ícones! Vá na sessão Downloads e baixe a variante da fonte que você gostar mais (pessoalmente gosto muito da Hack para usar no terminal, até porque ela foi feita pra isso).

Baixe o .zip correspondente ao arquivo da fonte de sua escolha

Agora basta extrair o conteúdo dessa pasta em ~/.fonts:

mkdir ~/.fonts && cd ~/.fonts
unzip ~/Downloads/<fonte_que_voce_escolheu>.zip

E então escolha-a nas configurações de seu terminal (isso costuma variar, mas geralmente algo como Preferências->Aparência->Fonte):

Geralmente fica a nomeclatura “<fonte> Nerd Font Regular”

Isso irá permitir a exibição de ícones em seu terminal!!

2°) Powerlevel9k: um tema que se integra lindamente ao git, suporta os ícones instalados no passo anterior e vai poupar alguns comandos repetitivos como o clássico git status só pra conferir se tem algo alterado no repo 😆

git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k

Daí troque o ZSH_THEME no seu “~/.zshrc” para powerlevel9k/powerlevel9k para habilitá-lo como tema e adicione POWERLEVEL9K_MODE="nerdfont-complete" para habilitar os ícones:

Note as linhas 10 e 11

Feche e reabra o terminal e voi lá!

Talvez seja interessante trocar o esquema de cores do seu terminal (algo como Preferêncis->Aparência/Cores) para melhor legibilidade 😉

Por padrão ele exibe seu_usaurio@host, seguido do diretório atual (com informações do status do projeto no git, se for o caso, que nem na segunda linha acima) e ao lado direito o status do último comando, seguido pelo “id” do último comando no histórico e a hora atual.

Mas isso é absurdamente personalizável! Dá pra colocar pra exibir até versões de langs em seu sistema, quantidade de ram usada, load average, code coverage e muuuito mais! Todas as opções disponíveis (e são muitas) podem ser encontradas aqui -> https://github.com/bhilburn/powerlevel9k#prompt-customization

Basta adicionar POWERLEVEL9K_LEFT_PROMPT_ELEMENTS = (...elements) e POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS = (...elements) no seu “~/.zshrc” logo após o POWERLEVEL9K_MODE:

Note as linhas 12 e 13

E reabrir o terminal, daí pronto! Terá o terminal como você tiver configurado:

Customize conforme seu gosto, tem muuuitas opções!! :D

Ah, e conforme você fizer ações num projeto, ele vai alterando as cores e os ícones pra você saber quando tiver algum arquivo modificado, deletado, adicionado, um stash, commits para baixar, commits para enviar, em qual server está seu origin, em qual branch você está..

É lindo! *-*

Se quiser algumas ideias, dê uma olhada no Show-Off-Your-Config deles, tem personalizações incríveis lá 😉


Bônus round

1°) Aliases: sabe aqueles comandos que você digita com alguma frequência? Além do autocompleter, você também pode criar “apelidos” para eles de apenas uma letra! O Oh My Zsh por exemplo já vem com g como alias para git , daí você pode adicionar mais no seu “~/.zshrc” usando a sintaxe:

alias c="comando"

Alguns dos alias que uso e acho bem úteis:

alias d="sudo docker"
alias m="mysql -u root -p"
alias vi="vim"
alias y="yarn"
alias yrw="yarn run watch"
alias yrp="yarn run prod"

Só lembrando que alguns plugins já adicionam aliases para você (como o dnf e o composer) 😬

2°) Tilix: um app de terminal super leve, com suporte à tiling e alguns dos principais temas de hoje já “built-in”:

Print do Tilix com tema “Material” e terminais “divididos” (tiling)

3°) Notificações: habilitando o plugin “bgnotify” (que já vem com o Oh My Zsh), quaisquer comandos que sejam concluídos enquanto o terminal não estiver focado irão emitir uma notificação no desktop (super útil pra geradores de projetos, como laravel new <project>, npx create-react-app <project> e atualizações de dependências, como composer update ou yarn upgrade):

O bgnotify irá te notificar quando uma tarefa em segundo plano estiver concluída \o/

Disclaimer para usuários “avançados”

Provavelmente vieram ideias à sua mente enquanto lia (tipo comparações com o Fish e configurações mais “complexas” de alguns dos itens); não mencionei tudo pra não acabar com um artigo enorme.. Mas por favor, fique à vontade para colocar elas nos comentários abaixo!


Para usuários do Fish

O mais próximo disso que consegui nele foi usar o Oh My Fish com o tema “bobthefish”:

curl -L oh-my.fish | fish
omf install bobthefish

Mas ainda assim não fica com todos os recursos descritos aqui 😝


Concluindo

Essencialmente espero que você reduza drasticamente a quantidade de teclas que você aperta para fazer tarefas cotidianas e acelere muito seu dia-a-dia 😎


Post Scriptum

Este ainda é um dos meus primeiros artigos por aqui, então estou super aberto à críticas construtivas 🙃


“Louvado seja Jeová, que diariamente leva a nossa carga,O verdadeiro Deus, que é a nossa salvação.” — Salmo 68:19