Configurando o Terminal com Oh My Zsh

Olá a todes!

Após sete meses em escrever para este humilde blog, venho com mais uma postagem nova. Na verdade venho documentar uma coisa que sempre faço quando realizo uma instalação limpa do Linux (qualquer distro) ou do Mac OS.

Antigamente eu usava o bash como meu interpretador de comandos principal (por ja vir definido como interpretador de comandos padrão no Linux). Eu sabia que existia outros interpretadores de comandos, mas nunca me interessei em utilizar outro diferente do bash. Mas tudo mudou em 2018 depois que eu comprei meu Macbook Pro 2015 (usado pois novo é caro demais, mas um dia eu chego lá) comecei a usar o Zsh que é o interpretador de comandos padrão do Mac OS.

Contudo a configuração padrão do Zsh do Mac OS é feia e, como de costume no Linux, eu queria deixar a interface CLI mais colorida. Comecei a pesquisar sobre como customizar o Zsh e acabei entrando em um mundo sem volta, dada a quantidade de plugins, configurações e opções de customizações.

Desbravando a Internet em busca de tutoriais cheguei a este tutorial no qual sempre que eu precisava configurar meu Zsh eu o seguia por conseguir um ótimo resultado ao final. Contudo, como tudo na vida, esse tutorial ficou desatualizado e tive que realizar as adaptações necessárias para que, ao final do processo, conseguisse o resultado esperado.

Assim o objetivo desta postagem é explicar o que é um interpretador de comandos, o que é o Zsh e documentar o processo de configuração e customização do Zsh no Linux e no Mac OS que uso atualmente para que eu, e outras pessoas interessadas, possam usufruir desse maravilhoso interpretador de comandos.

Interpretador de Comandos

Um interpretador de comandos, também conhecido como shell, é o programa responsável por interpretar as instruções (comandos) enviados pelas pessoas ou programas ao núcleo (kernel) do sistema operacional. Ele recebe os comandos através do dispositivo de entrada padrão (teclado) ou através de um arquivo executável chamado de script (eis a origem do termo shell script).

Existem diversos tipos de interpretadores de comandos, tais como o sh, bash, csh, zsh, ash, tcsh, ksh, etc. Dentre os interpretadores de comandos citados, o bash é o mais utilizado (por vir como padrão na maioria das distribuições linux).

O Zsh

O Z Shell, ou Zsh, é um interpretador de comandos Unix que pode ser utilizado como interpretador de comandos interativo e como interpretador de comandos por script. O Zsh é uma extensão do Bourne Shell com diversos melhoramentos, incluindo recursos do bash, tcsh e ksh.

A primeira versão do Zsh foi escrita por Paul Falstad em 1990, quando ainda era estudante da Universidade de Princeton. O nome Zsh deriva do nome do professor de Yale Zhong Shao (na época, professor assistente na Universidade de Princeton) - Paul Falstad considerava o login-id de Shao, “zsh”, como um bom nome para um shell.

Customizando seu Zsh

Sem mais delongas, vamos ao que interessa, configurar o nosso queride Zsh! Este tutorial pode ser utilizado em sistemas operacionais GNU/Linux (qualquer distro com pequenos ajustes), Mac OS e no Windows Subsystem for Linux (vulgo WSL).

Passo 1 - Instalando o Zsh

O primeiro passo é instalar o Zsh em seu sistema operacional! Aqui o tutorial sofre uma ramificação, a depender do seu sistema operacional. Então criarei subseções específicas para cada sistema operacional.

Mac OS

Se você esta utilizando o Mac OS como sistema operacional, provavelmente voce já deve possuir o Zsh devidamente instalado. Para ter certeza, abra uma janela do terminal digite e execute o comando abaixo:

echo $SHELL

Este comando exibe o conteúdo da variável de ambiente SHELL. Essa variável de ambiente armazena o caminho do executável do interpretador de comandos que esta sendo utilizado pelo seu sistema operacional. Após a execução deve ser mostrado o seguinte resultado, caso tenha o Zsh instalado:

/bin/zsh

Se isso foi exibido, parabéns! Vamos ao próximo passo!

GNU/Linux e WSL

Se você está utilizando uma distribuição GNU/Linux ou o WSL no Windows 10/11 com terminal Linux, provavelmente o seu terminal estará utilizando o bash como interpretador de comandos. Para termos certeza, abra um terminal e digite e execute o seguinte comando:

echo $SHELL

Este comando exibe o conteúdo da variável de ambiente SHELL. Essa variável de ambiente armazena o caminho do executável do interpretador de comandos que esta sendo utilizado pelo seu sistema operacional. Após a execução deve ser mostrado o seguinte resultado:

/usr/bin/bash

O que significa que seu terminal está utilizando o bash como interpretador de comandos. Assim teremos que instalar o Zsh no sistema operacional e, em seguida, defini-lo como interpretador de comandos padrão.

Para instalar o Zsh pode-se utilizar o gerenciador de pacotes padrão da sua distribuição GNU/Linux.

  • Para distribuições baseadas em Debian/Ubuntu:
    sudo apt install zsh
    
  • Para distribuições baseadas em Fedora/Red Hat:
    sudo dnf install zsh
    
  • Para distribuições baseadas em Arch Linux:
    sudo pacman -S zsh
    

Caso você utilize alguma distro que não fora abordada diretamente neste tutorial, basta verificar como instalar o Zsh a partir do gerenciador de pacotes da sua distro (provavelmente existirá um pacote do Zsh para sua distro).

Após instalarmos o Zsh no sistema operacional, temos que configura-lo como interpretador de comandos padrão do sistema. Para isso digite e execute o seguinte comando:

chsh -s /usr/bin/zsh

Para surtir efeito deve-se fechar a sessão atual (logout) e abrir uma nova sessão (login) ou, a forma que eu prefiro, reiniciar o sistema operacional (no WSL basta fechar a janela do terminal e abri-la de novo).

Passo 2 - Instalando o Oh My Zsh

Deste passo em diante, todos os comandos são os mesmos para qualquer sistema operacional. Primeiramente vamos instalar o Oh My Zsh.

Para realizar a instalação do Oh My Zsh precisaremos ter instalado o cURL. Caso não o tenha, instale utilizando seu gerenciador de pacotes padrão (e.g. apt install curl).

Oh My Zsh é um framework construído em cima do zsh que é estruturado para permitir que o mesmo possua plugins e temas. Para instala-lo, digitamos e executamos o seguinte comando em um terminal:

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Após a execução do comando acima, será realizado o download e a execução do instalador em seu sistema operacional. Será exibido no terminal algumas informações conforme pode ser visto na imagem abaixo:

Saída da instalação do Oh My Zsh

A partir desse momento todas as configurações relacionadas a configuração do interpretador de comandos deverá ser realizada no aquivo .zshrc (preste atenção no ponto no nome do arquivo) que estará na sua pasta de usuário (geralmente referencia-se a pasta de usuário, nos ambientes *nix, com o simbolo ~ ao invés do caminho de diretório completo como, ex. ~/.zshrc).

Passo 3 - Configurando o tema Dracula

O Dracula é um tema de cores escuras utilizado em terminais, editores de texto e IDEs. Acesse a página do Dracula Theme e procure pelo aplicativo de terminal, editor de texto ou IDE que você utiliza e proceda com a instalação do mesmo. Abaixo deixo o link para os aplicativos de terminal mais comuns:

Caso tenha alguma dificuldade neste passo, deixe um comentário com sua dificuldade para que eu possa melhorar essa parte do texto.

Passo 4 - Configurando a fonte do terminal

O Nerd Fonts é um repositório de fontes gratuitas e modificadas que são voltadas para o desenvolvimento de software. As modificações realizadas nas fontes dizem respeito a adição de glifos (ícones) que podem ser utilizados no terminal.

Particularmente, gosto muito da fonte JetBrainsMono Nerd Font que é uma fonte criada pela JetBrains voltada para pessoas desenvolvedoras de software. Ela possui suporte a ligaduras e foi pensada de forma a não gerar ambiguidades entre símbolos (o simbolo da letra “o” maiúscula é diferente do zero). Desse ponto em diante seguirei instalando a fonte JetBrainsMono Nerd Font mas sinta-se a vontade de instalar a fonte de sua preferência.

Realize o download da fonte JetBrainsMono Nerd Font. O download será de um arquivo ZIP contendo os arquivos da fonte (extensão ttf) dentro do mesmo.

Após descompactar o arquivo ZIP no Mac OS, utilize o aplicativo Font Book (Catalogo de Fontes) para instalar todos os arquivos de fonte, arrastando todos os arquivos com a extensão ttf do Finder para o Font Book.

Caso esteja utilizando o GNU/Linux como sistema operacional ou via WSL, copie todos os arquivos com a extensão ttf para a pasta ~/.fonts (crie a pasta se a mesma não existir). Abaixo segue os comandos para criar a pasta fonts e copiar os arquivos ttf para a mesma (lembre-se de executar os comandos abaixo dentro da pasta descompactada com os arquivos ttf)

mkdir -p ~/.fonts
cp *.ttf ~/.fonts

Ao copiar os arquivos ttf para dentro da pasta .fonts as fontes já estarão disponíveis para todas as aplicações do seu GNU/Linux.

Após instalar a fonte vá ate as configurações do seu aplicativo de terminal (Gnome Terminal, Konsole, etc) e escolha a fonte instalada como fonte principal do seu terminal. A figura abaixo mostra o processo no aplicativo de terminal do Mac OS.

Escolhendo fonte terminal Mac OS

Passo 5 - Tema Spaceship

O Spaceship é um prompt Zsh minimalista, poderoso e extremamente personalizável. Ele combina tudo o que é necessário para um trabalho conveniente, sem complicações desnecessárias.

Para instala-lo em nosso Oh My Zsh devemos primeiramente clonar o repositório do projeto digitando e executando o comando abaixo:

git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$ZSH_CUSTOM/themes/spaceship-prompt" --depth=1

Depois devemos criar um link simbólico para que o nosso Oh My Zsh possa enxerga-lo. Digite e execute o comando abaixo para criar o link simbólico necessário:

ln -s "$ZSH_CUSTOM/themes/spaceship-prompt/spaceship.zsh-theme" "$ZSH_CUSTOM/themes/spaceship.zsh-theme"

Após isso, vamos editar o arquivo ~/.zshrc (utilize o editor de texto de sua preferência) e altere o valor da variável ZSH_THEME de forma a ficar igual ao bloco a seguir:

ZSH_THEME="spaceship"

Após alterar a variável ZSH_THEME reinicie o terminal e você verá o tema sendo aplicado em seu terminal, deixando-o mais limpo e bonito

Terminal com o tema Spaceship

Passo 6 - Configurações adicionais

A partir desse ponto o essencial já está devidamente configurado. Contudo existem alguns ajustes nas preferências que particularmente gosto de utilizar nas minhas configurações de terminal. Dito isso, sinta-se a vontade em incluir, retirar ou alterar quaisquer configurações apresentadas a diante.

Configurando o Spaceship

Uma das coisas que achei visualmente impactante, foi o fato de mostrar no terminal a versão das ferramentas que estão sendo utilizadas no terminal (python, docker, git, etc). Isso pode afetar o tempo de resposta do terminal, então desativo os itens que não utilizo.

Primeiramente entre no arquivo ~/.zshrc e adicione o seguinte conteúdo. Abaixo estão todas as configurações possíveis do tema spaceship. Para ativar ou desativar alguma configuração do spaceship basta remover ou adicionar o caractere # no início da linha, respectivamente.

SPACESHIP_PROMPT_ORDER=(
#  time          # Time stamps section
  user           # Username section
  dir            # Current directory section
  host           # Hostname section
  git            # Git section (git_branch + git_status)
#  hg            # Mercurial section (hg_branch  + hg_status)
#  package       # Package version
  gradle         # Gradle section
#  maven         # Maven section
  node           # Node.js section
#  ruby          # Ruby section
  elixir         # Elixir section
#  xcode         # Xcode section
#  swift         # Swift section
  golang         # Go section
  php            # PHP section
#  rust          # Rust section
  haskell        # Haskell Stack section
#  julia         # Julia section
  docker         # Docker section
#  aws           # Amazon Web Services section
#  gcloud        # Google Cloud Platform section
  venv           # virtualenv section
#  conda         # conda virtualenv section
  pyenv          # Pyenv section
#  dotnet        # .NET section
#  ember         # Ember.js section
#  kubectl       # Kubectl context section
#  terraform     # Terraform workspace section
#  ibmcloud      # IBM Cloud section
  exec_time      # Execution time
  line_sep       # Line break
#  battery       # Battery level and status
  vi_mode        # Vi-mode indicator
  jobs           # Background jobs indicator
  exit_code      # Exit code section
  char           # Prompt character
)

SPACESHIP_USER_SHOW=always
SPACESHIP_PROMPT_ADD_NEWLINE=false
SPACESHIP_CHAR_SYMBOL="❯"
SPACESHIP_CHAR_SUFFIX=" "

Após adicionar o conteúdo acima ao final do arquivo ~/.zshrc feche a abra novamente o terminal para que as alterações entrem em vigor.

Plugins do Zsh

Também gosto de adicionar alguns plugins do Oh My Zsh que facilitam na hora de executar comandos no terminal. Para instalar tais plugins é necessário configurar o Zinit, uma ferramenta que auxilia no gerenciamento de plugins para o Oh My Zsh. Para instalar o Zinit digite e execute o comando abaixo:

sh -c "$(curl -fsSL https://git.io/zinit-install)"

Após a instalação do Zinit entre novamente no arquivo ~/.zshrc, vá até o fim do arquivo e adicione as seguintes linhas:

zinit light zdharma-continuum/fast-syntax-highlighting
#zinit light zsh-users/zsh-autosuggestions                
zinit light zsh-users/zsh-completions

O primeiro plugin melhora a capacidade de destaque de sintaxe do Zsh. O segundo plugin adiciona um plugin de sugestões automáticas rápidas/discretas para o ZSH no estilo Fish-like (particularmente eu nao gosto e deixo essa linha comentada, mas caso queira testar fique a vontade). Ja o terceiro e último plugin da lista adiciona a capacidade de sugestões automáticas ao ZSH

Após adicionar o conteúdo acima ao final do arquivo ~/.zshrc feche a abra novamente o terminal para que as alterações entrem em vigor.

Considerações finais

Aqui descrevi como configuro meu terminal Zsh, seja no Windows (via WSL 2), GNU/Linux ou Mac Os. Tentei abordar todos os detalhes necessários para que você, minha cara pessoa leitora, seja capaz de reproduzir esses passos e alcançar o mesmo resultado nos terminais os quais configuro.

Resultado final do Terminal

Mas caso tenha alguma dificuldade, dúvida, critica construtiva (as detrativas serão automaticamente desconsideradas) ou sugestão, por favor não hesite em deixar seu comentário.

Até o próximo artigo!