Elevando o nível do terminal: customizando suas funcionalidades
Tags: tutorial, beginners, linux, programming
Published: 2023-01-06 02:03:03

*******
# Índice
1. [Apresentação](#apresentação)
2. [Introdução](#introdução)
3. [O que é terminal?](#o-que-é-terminal)
4. [Alguns tipos de shell](#alguns-tipos-de-shell)
	1. [Bash](#bash)
	2. [Zsh](#zsh)
	3. [Fish](#fish)
5. [Customizações para cada shell](#customizações-para-cada-shell)
	1. [Arquivos de configuração](#arquivos-de-configuração)
	2. [Visual](#visual)
		1. [Bash e oh-my-bash](#bash-e-oh-my-bash)
		2. [Zsh e oh-my-zsh](#zsh-e-oh-my-zsh)
		3. [Fish, oh-my-fish, fisher e z](#fish-oh-my-fish-fisher-e-z)
	3.  [Nerd Fonts](#nerd-fonts)
6. [Conclusão](#conclusão)

*******

# Apresentação
Se você tem interesse em começar a utilizar Linux em 2023, ou então já utiliza e quer customizar e maximizar sua performance utilizando o terminal, saiba que você está no local correto! Este guia tem a intenção de mostrar como você pode utilizar ferramentas nativas do próprio terminal e customizá-lo para deixar a sua cara, aumentando sua produtividade e saindo um pouco da zona de conforto!

# Introdução
O terminal vem fazendo parte do dia-a-dia dos desenvolvedores há muito tempo, sendo possível dizer que a evolução dos computadores para o que conhecemos hoje só se tornou possível porque lá atrás o terminal em si foi criado, com essa carinha de "uma tela preta com várias letrinhas", que, durante o tempo em que não tínhamos uma interface gráfica, ele era nosso meio de comunicação com o computador.

Atualmente, vivemos em uma época em que a tecnologia faz parte da vida de praticamente todos nós, por isso, nos acostumamos com certas interfaces e maneiras de resolver diversos problemas em nosso cotidiano, resultando em um efeito que faz com que a tecnologia de ponta seja cada vez mais simples de ser compreendida aos olhos humanos de acordo com os níveis de abstrações que são adicionados nela.

Sendo assim, não é tão difícil de encontrar alguém que não sabe ou não gosta de utilizar um computador via terminal, o que caracteriza não como um fenômeno negativo, mas, como um fenômeno resultante do grande alcançe da tecnologia na vida das pessoas, possibilitando o uso delas sem a necessidade de grandes estudos por trás. A tecnologia está em nosso meio e faz parte do nosso cotidiano de uma forma tão entrelaçada que muitas das vezes não conseguimos nem sequer perceber.

Pontuando esse avanço da tecnologia, hoje, irei mostrar para vocês como o terminal também evoluiu muito, se tornando uma ferramenta poderosa, fazendo com que o usuário que domine o terminal e suas ferramentas se torne totalmente independente e produtivo no decorrer dos dias como desenvolvedor.

# O que é terminal?
Surgindo no início da era da computação, existindo até hoje como uma ferramenta essencial em um sistema operacional, basicamente, o terminal seria nada mais nada menos que a primeira interface que possibilitou a interação humano-computador, na qual uma sequência de comandos pode ser enviada (entrada), depois é processada (processamento), e retorna uma resposta (saída).

O terminal "tem" aparência de uma tela preta mesmo esperando uma entrada de comandos (a palavra foi colocada entre aspas porque atualmente, não necessariamente um terminal é assim, afinal, ele pode ser customizado de diversas maneiras e isso vai ser mostrado aqui posteriormente). Ele é o contato do usuário com o "shell", e utiliza um interpretador de comandos para o "shell". 

Shell nada mais é que a camada que fica como "interlocutora" entre o usuário e o kernel do sistema operacional, sendo responsável por validar e enviar comandos para o kernel, que é responsável por gerenciar o nosso hardware.
<center>
	<figure>
		<img src="https://i.stack.imgur.com/Znlqz.jpg" alt="Imagem demonstrando que o Shell envolve o Kernel enquanto o usuário envia uma entrada diretamente para o Shell"/>
		<figcaption>Imagem demonstrando o processo de entrada do usuário e envio da instrução para o Kernel</figcaption>
	</figure>
</center>

Atualmente, na maioria das distribuições Linux, o terminal é encontrado em forma de emulador externo, rodando como uma aplicação comum em que muitas das vezes alguns usuários nem se dão conta que podemos instalar diversos outros emuladores que utilizam aceleração de GPU (uma ferramenta poderosa para os usuários com GPUs mais "potentes"), personalização visual simples, personalização de fontes, entre outras diversas customizações possíveis.

Utilizar o emulador de terminal padrão de sua distribuição Linux é uma escolha sua, vai de cada um com qual tipo de emulador é mais agradável, por isso, a escolha em si é com vocês! Irei apresentar algumas customizações de interpretadores de Shell, seguindo para uma apresentação de diversos emuladores de terminal que podem ser instalados tanto em distribuições Linux quanto demais sistemas operacionais baseados no Unix, como macOS e FreeBSD por exemplo.

Por mais que deixe o texto mais longo, as explicações básicas do funcionamento e história do terminal são necessárias para um total compreendimento, possibilitando você partir desse ponto para avançar em seus conhecimentos.

# Alguns tipos de Shell
Existem diversos tipos de interpretadores de comandos, mas, irei citar três principais que vocês podem optar pela utilização e customização, partindo de sua interface mais pura, até chegarmos em um ponto no qual você se sentirá confortável.

## Bash
Utilizado em diversas distribuições Linux como interpretador de comandos padrão, o Bash atualmente é mantido pelo projeto GNU e Free Software Foundation. O bash possui uma interface já muito agradável quando comparamos com outros interpretadores do próprio projeto GNU, como o "sh" por exemplo, que atualmente é encontrado interpretador de comandos padrão de distribuições sem interface gráfica nativa para instalação (como em alguns servidores), ou então em outros projetos de sistemas operacionais baseados no Unix, como o FreeBSD.

Amplamente difundido e, acredito, que seja o interpretador de comandos mais utilizado em distribuições Linux, o bash pode ser a escolha perfeita para você. Sua aparência após a instalação pode ser encontrada de diversas formas, mas, atualmente existem duas principais que podemos destacar, que são parecidas como:
```
[guto@turing ~]$

guto@turing:~ $
```

## Zsh
Surgindo nos anos 90, o zsh atraiu os olhos de muitos usuários no decorrer dos anos por ser um interpretador de comandos um pouco diferente do Bash. Sua aparência e funcionalidade após a instalação são bem mais simples que o bash, mas, após uma série de customizações, ele pode ficar extremamente poderoso. 

Sendo distribuído inicialmente com uma licença respeitando os padrões de Berkeley, o zsh teve sua disparada em uso em sistemas macOS quando a Apple em 2020 trocou oficialmente o shell padrão de seu sistema operacional para os usuários do bash para o zsh devido à algumas questões envolvendo a licença GNU GPL v3.0.

A inicialização do zsh após a instalação é bem simples: caso já tenha o arquivo de configuração do zsh (podendo ser .zshrc por exemplo), ele iniciará com uma aparência trazendo o nome da máquina apenas (muito parecido com o sh), mas, caso não tenha esse arquivo ainda, ele irá exibir uma mensagem alertando que não existe esse arquivo, que no caso, apertando "0", irá automaticamente criar este arquivo vazio apenas para não retornar mais esta mensagem. A aparência inicial do zsh é algo como:
```
turing%
```

## Fish
Tendo sua release inicial em 2005, o fish shell tem agradado diversos usuários pelo mundo principalmente pela sua facilidade em customizações, com funções nativas incluindo de autocompletar comandos com sugestões automáticas, visuais pré-configurados, entre outras diversas características.

O fish shell é também software livre e inclui partes de licenças da GNU GPL v2.0, licença OpenBSD, licença ISC e licença NetBSD, podendo ser avaliado em seu repositório no [github](https://github.com/fish-shell/fish-shell). Na maioria dos casos o fish shell deverá ser instalado externamente, afinal, nem todas as distribuições possuem ele instalado por padrão. 

Sua aparência por padrão é agradável e parecida com do bash, se diferenciando por ter um "peixe" no lugar de um simples cifrão ("$") para usuários não root. Sua aparência padrão se parece com:
```
guto@turing ~>
```

O fish shell pode conter integração direta com seu emulador de terminal, possibilitando a sua customização diretamente de uma página gerada localmente ao se executar o comando "fish_config", na qual é possível customizar as cores, funções, atalhos, entre outras diversas funcionalidades. A tela gerada é parecida com a imagem abaixo:
<center>
	<figure>
		<img src="https://blog.jpalardy.com/assets/fish-shell/web_config.png" alt="Imagem da tela de configuração do fish shell gerada localmente após a execução do comando fish_config"/>
		<figcaption>Apresentação da tela de configuração do fish shell com o comando fish_config</figcaption>
	</figure>
</center>

# Customizações para cada shell
Agora, vamos partir para o momento de configuração de seu interpretador de comandos escolhido.

## Arquivos de configuração
Os arquivos de configuração de cada shell podem variar de nome, mas, iremos abordar seus nomes e como acessá-los, e quais são as principais funções que podemos customizar e utilizar em nosso cotidiano, como por exemplo a criação de um alias.

- Bash: .bashrc ou .bash_profile
- Zsh: .zshrc ou .zsh_profile
- Fish: ~/.config/fish/config.fish

Abra o arquivo em seu editor de texto favorito, e poderá encontrar uma série de instruções que você ainda não conhecia ou até mesmo não fazia ideia do que serviriam.

Neste arquivo, vá para o final dele para não termos a possibilidade de danificar seu conteúdo ou até mesmo comprometer alguma função que você goste. Na última linha, poderemos adicionar uma série de comandos que nosso interpretador deve compreender.

A primeira das instruções a ser criada será um exemplo de "alias", que nada mais seria que um "apelido" para alguma sequência de comandos que desejamos executar. Neste caso irei criar um alias para instalar algum pacote com permissões de root (o famoso "sudo"). Nosso alias ficará com essa carinha:
```sh
alias install="sudo apt install" # Para distribuições baseadas no Debian
alias install="sudo dnf install" # Para distribuições baseadas no Red Hat
alias install="sudo pacman -Sy" # Para distribuições baseadas no Arch Linux

# Para macOS
alias install="brew install" # Caso esteja utilizando o Homebrew como gerenciador de pacotes
```

Por favor, se atente para qual distribuição está adicionando o comando, afinal, cada uma possui um gerenciador de pacotes próprio certo? O que acham de um artigo no futuro falando um pouco sobre a estrutura de um sistema operacional Linux?

A estrutura da criação de um alias é bem simples e respeita a sequinte estrutura:
```sh
alias [comando]="[comando a ser executado ao chamar este alias]"
```

O uso de alias no dia-a-dia é poderoso e pode facilitar muito quando falamos de produtividade, que, podemos expandir para uma série de funções que podemos instalar e customizar dentro de nosso arquivo de configuração, no qual, iremos customizar sua aparência agora.

Percebeu que o fish shell possui um arquivo um pouco diferente? Pois é, ele aceita instruções um pouco diferenciadas em seu uso, mas, para não me extender tanto, saiba que você pode acessar a [documentação oficial do fish shell](https://fishshell.com/docs/current/).

## Visual
Agora você sabe onde fica seu arquivo de configuração de seu interpretador de comandos, por isso, já sabe onde você pode criar funções nativas interpretadas em Shell para seu dia-a-dia! Desta forma, vamos agora para uma customização visual de cada shell.

### Bash e oh-my-bash
Partindo para a aparência, sabemos que o bash possui uma aparência que pode não agradar a todos, mas, que pode ser customizada e para isso existem duas principais formas que serão apresentadas: utilizando o comando padrão para criação de aparências ou por meio de uma ferramenta que facilita nossa customização, chamada "oh-my-bash", sendo mantida por uma comunidade incrível.

A linha abaixo vai mostrar como a aparência de sua linha de entrada no bash pode ser modificada alterando o PS1, responsável por deixar com esse visual mais agradável:
```sh
export PS1='\u@\h:\[\e[01;32m\]\w\[\e[0m\]\$ '
```

Basicamente ele deixa com uma cara de "user@host:caminho/para/diretório $" com o nome do host em verde! Para alterar as cores de foreground foram necessários adicionar o trecho de código que contém alguns números no seu interior, sendo o código da cor respeitando a tabela ANSI para o bash! Um detalhe importante para se lembrar é que de acordo com seu emulador de terminal essas cores podem conter tonalidades diferentes que você mesmo consegue customizar!
<center>
	<figure>
		<img src="https://i.stack.imgur.com/PRUhI.png" alt="Imagem com tabela de cores ANSI mostrada pelo terminal"/>
		<figcaption>Tabela de cores e códigos ANSI apresentado pelo terminal</figcaption>
	</figure>
</center>
O suporte para o chamado "true color", que seriam as 256 cores RGB varia de acordo com o emulador de terminal que você estiver utilizando.

Certo, mas, e se eu quiser realizar uma customização mais simples sem a necessidade de alterar códigos de cores ou então já utilizar alguma customização existente, eu consigo? A resposta é sim, você consegue e o projeto oh-my-bash surgiu com essa finalidade!

Acessando o [site oficial](https://ohmybash.nntoan.com/) você consegue navegar pela documentação, contribuir e visualizar os temas já publicados, e sua instalação pode ser feita utilizando curl ou wget. Caso ainda não tenha instalado nenhum dos dois pacotes, basta utilizar os seguintes comandos:

***wget***
```
sudo apt install wget # Para distribuições baseadas no Debian
sudo dnf install wget # Para distribuições baseadas no Red Hat
sudo pacman -Sy wget # Para distribuições baseadas no Arch Linux

# Para macOS
brew install wget # Caso esteja utilizando o Homebrew como gerenciador de pacotes
```

***curl***
```
sudo apt install curl # Para distribuições baseadas no Debian
sudo dnf install curl # Para distribuições baseadas no Red Hat
sudo pacman -Sy curl # Para distribuições baseadas no Arch Linux

# Para macOS
brew install curl # Caso esteja utilizando o Homebrew como gerenciador de pacotes
```

Após realizar a instalação, basta abrir uma nova aba de seu emulador de terminal para atualizar e já conseguirá ver que o tema padrão foi alterado! Para navegar entre os temas do oh-my-bash, basta clicar na aba de temas e acessar o [repositório](https://github.com/ohmybash/oh-my-bash/wiki/Themes) que apresenta todos os temas e escolher um de seu interesse.

Assim que escolher, basta abrir o arquivo de configuração do bash (.bashrc ou .bash_profile) e logo no início do arquivo irá se deparar com algo como:
```sh
OSH_THEME="font"
```

Basta trocar o nome "font" para o nome do tema que deseja colocar (sem remover as apas), e pronto! Agora é só reiniciar o seu emulador de terminal ou abrir uma nova aba e você já estará com seu novo visual! O que achou?

### Zsh e oh-my-zsh
A configuração do visual do zsh shell parte do mesmo princípio que do bash com a criação de uma variável "PS1" podendo ser acessada na aba acima.

O oh-my-zsh é um projeto mantido por uma comunidade assim como o projeto oh-my-bash, porém, possui algumas diferenças que fazem com que essa comunidade seja enorme, que vai desde uma documentação completa até mesmo uma loja de produtos da qual podemos adquirir camisetas, adesivos, entre outros.

Acessando o [site oficial](https://ohmyz.sh/) projeto podemos visualizar um guia de instalação simples utilizando curl ou wget, no qual foi mostrado anteriormente como podemos instalar ambas ferramentas.

Após a instalação, podemos facilmente navegar pela aba de [temas do oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) (que também é disponibilizada no site) e escolher algum tema de nossa preferência que, ao abrir nosso arquivo de configuração (.zshrc ou .zsh_profile por exemplo) iremos nos deparar com algo parecido no início de nosso arquivo de configuração:
```sh
ZSH_THEME="robbyrussell"
```

Para trocar o tema e escolher o tema de seu gosto pessoal, basta alterar o nome que está entre aspas para o nome do tema que deseja instalar e depois abrir uma nova aba de seu emulador de terminal para inicializar com o novo tema funcionando normalmente!

### Fish, oh-my-fish, fisher e z
O fish shell, como foi dito anteriormente, possui algumas configurações adicionais que podem ser utilizadas para customizar nosso shell e neste caso, podemos manusear e manipular plugins dentro dele mesmo.

O arquivo de configuração do fish se encontra no caminho "~/.config/fish/config.fish" e podemos customizar a entrada utilizando o "PS1", assim como no bash e no zsh. Caso queira uma interface um pouco mais agradável para customizar seu funcionamento, basta utilizar o comando "fish_config" que será aberto um mini servidor local para que suas alterações tenham efeito em tempo real.

Assim como o oh-my-bash e o oh-my-zsh, o oh-my-fish surgiu com a possibilidade de usuários poderem utilizar temas pré-definidos publicados e mantidos pela comunidade como uma forma de proporcionar um melhor uso do fish shell. O oh-my-fish não possui uma página oficial, mas, seu [repositório](https://github.com/oh-my-fish/oh-my-fish) está publicado no GitHub, podendo ser instalado de diversas maneiras, mas, com o script de instalação simples utilizaremos o comando:
```sh
curl https://raw.githubusercontent.com/oh-my-fish/oh-my-fish/master/bin/install | fish
```

Caso possua algum problema para a instalação, basta acessar a página oficial do GitHub do oh-my-fish e instalar clonando diretamente o repositório oficial, assim como é mostrado no README do projeto.

Os [temas](https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md) podem ser acessados e escolhidos de acordo com seu gosto e sua instalação pode ser feita com o comando:
```sh
omf install URL # Para inserir a URL do tema
omf install user/repo # Para inserir o repositório do tema
omf install name # Para inserir o nome do tema da lista de temas pré-instalados
```

Agora, partindo para a customização de usabilidade do fish shell podemos citar o [fisher](https://github.com/jorgebucaran/fisher), que é um gerenciador de plugins para o fish shell, sendo utilizado para instalar diversos repositórios com funcionalidades incríveis que o fish shell pode oferecer.

Para instalar o fisher basta executar o seguinte comando:
```sh
curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher
```

Após instalado você pode checar uma [lista de plugins](https://github.com/jorgebucaran/awsm.fish) que mostra diversos que são utilizados pela comunidade.

A grande cereja do bolo vem agora, com os plugins podendo ser customizados e sua aparência sendo única: [z](https://github.com/jethrokuan/z). Isto mesmo, este nome, o "z" tem como função trabalhar para registrar os diretórios que você visita e criar atalhos que facilitam sua navegação dentro de seu sistema operacional. Para instalar o z com o fisher basta executar o seguinte comando:
```sh
fisher install jethrokuan/z
```

Após isso, pode começar a utilizar seu emulador de terminal normalmente, até que ele consiga registrar entradas repetitivas em um diretório para criar diversos atalhos. Caso tenha dúvidas, o [manual](https://github.com/jethrokuan/z/blob/master/man/man1/z.md) do z pode ser acessado ainda no GitHub.

Caso queira configurações mais extensas envolvendo o fish shell, recomendo assistirem ao canal do Takuya Matsuyama que se chama "[devaslife](https://www.youtube.com/@devaslife)" e um vídeo específico em que ele mostra [como configura o fish shell](https://youtu.be/KKxhf50FIPI) em seu cotidiano.

## Nerd Fonts
Em nosso cotidiano, muitas das vezes vamos encontrar diversos caracteres especiais ou símbolos formados que, quando digitamos, não formam exatamente o que gostaríamos. Um exemplo prático seria quando estamos escrevendo nosso código e o "!=" não se parece com o mesmo da matemática, ou então "->" não se parece tanto com uma seta.

Foi desta necessidade que surgiram as "Nerd Fonts", com objetivo de suprir e conseguir deixar nosso editor de código com um aparência mais legal, funcionando no nosso terminal e fazendo com que símbolos especiais sejam compreendidos e apresentados da forma esperada.

A [página inicial](https://www.nerdfonts.com) possui link para o [repositório ofiical](https://github.com/ryanoasis/nerd-fonts) do projeto, mostrando suas releases e atualizações com novas fontes. Para instalar as fontes é bem simples: você pode instalar baixando os arquivos zipados e instalando as fontes, ou, instalar pelo seu gerenciador de pacotes.

A quantidade de símbolos que estas fontes conseguem atingir é enorme, possibilitando diversas customizações.
<center>
	<figure>
		<img src="https://www.nerdfonts.com/assets/img/sankey-glyphs-combined-diagram.png" alt="Imagem demonstrando a compatibilidade das fontes 'Nerd Fonts' comparado com diversos ícones e símbolos"/>
		<figcaption>Comparação do "Nerd Fonts" com diversos ícones e símbolos e sua compatibilidade</figcaption>
	</figure>
</center>


# Conclusão
O uso do terminal no dia-a-dia do desenvolvedor pode ser útil de infinitas formas. Saber ser independente e conseguir utilizar o terminal é um trabalho que requer dedicação, mas, que com toda certeza vale a pena cada segundo de aprendizado.

O terminal é uma ferramenta poderosa e pode ser a única que um desenvolvedor pode utilizar em seu cotidiano desde que saiba como utilizar da maneira correta.

Customizar o terminal não é perca de tempo, é um aprendizado para deixar com que seu ambiente de trabalho se torne mais confortável e mais acessível para seus gostos pessoais, fazendo com que você se sinta satisfeito.

Independente do shell que você escolher, como vai customizar e qual emulador de terminal gosta, espero que este guia tenha te ajudado e tenha lhe adicionado algo de novo em seu aprendizado.