[PT-BR] Rodando oh-my-zsh no Windows
Tags: ohmyzsh, zsh, windows, devlife
Published: 2020-01-12 18:58:09

# Disclaimer: This article is outdated.
A lot has changed since I wrote it. Win10 now supports WSL2, Ubuntu had a whole new update with LTS 20 and it's impossible to proceed using cmder to integrate with bash/shell. It crashes A LOT.

I'm testing a new Win10 environment that is similar, but using Hyper terminal. When I'm ready, I'll create a whole new article about it. 

Until there, proceed with caution. Or, if you know what you're doing, just switch cmder with Hyper and you'll be just fine.

PS: also there's a lot of fonts that are broken and buggy in Win10 recent updates. That's just sad.

---

# Table Of Contents
* [0. Prólogo](#0-prologo)
* [1. Instalando o Ubuntu no Windows](#1-instalando-o-ubuntu-no-windows)
* [2. Instalando o Cmder](#2-instalando-o-cmder)
* [3. Instalando o oh-my-zsh](#3-instalando-o-oh-my-zsh)
* [4. Configurando o oh-my-zsh](#4-configurando-o-oh-my-zsh-no-cmder)
* [5. Customizando o oh-my-zsh](#5-customizando-o-oh-my-zsh)
* [6. Conclusão](#6-conclusao)

# 0. Prólogo <a name="0-prologo"></a>
Uso Windows desde sempre. Como toda a vida joguei, sempre preferi a plataforma do que seus concorrentes. No entanto, foi uma surpresa ao voltar a ser dev em 2018 - quase 10 anos fora da área - qdo descobri que os devs preferem distros Linux e MacOS do que a opção "de sempre". E, mesmo assim, me mantive na plataforma até então.

Porém foi ao formatar um Macbook Pro 13" que possuo desde 2010, que percebi que os usuários de zsh são mais "felizes" do que quem usa cmder. Eles tinham autocomplete, syntax highlight, branch check, temas legais, e... nada disso no Windows.

Foi aí que pesquisei um conteúdo maneiro, e decidi diluir todo o how-to por aqui. Então bora começar:

# 1. Instalando o Ubuntu no Windows <a name="1-instalando-o-ubuntu-no-windows"></a>
A build 1903 do Windows veio com tudo, e o WSL foi um dos maiores ganhos da plataforma: poder rodar ubuntu, dentro do windows, sem precisar fazer dual boot.

Parece mágica, até.

* Primeiro, atualize o seu Windows pra build mais recente, e garanta que ele esteja acima da build 1903.

* Depois, abra o PowerShell em Administrador, e execute o seguinte comando:

`Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux`

* Caso solicite, reinicie o PC.

* Abra a Microsoft Store. Pesquise por `Ubuntu`. Selecione a versão padrão e baixe. São 221MB, portanto, vai ser rápido.

* Quando terminar, um prompt do Ubuntu aparecerá na tela e irá te pedir por um `username` e `password`. Entre com as informações. Quando concluir, seu super user terá sido criado e o prompt ficará ativo para receber comandos.

Agora, precisamos atualizar o Ubuntu para sua versão mais recente. Para isso, vamos utilizar dois comandos.

* Entre com o comando `sudo apt-get update` para fazer o fetch do que precisa ser atualizado. Leva um tempo.

* Após finalizado o fetch, entre com o comando `sudo apt-get upgrade`. Ele irá pedir uma confirmação da ação. Confirme com `Y`. Vai demorar bastante. No meio da instalação, é capaz que ele pergunte para ter permissão para reiniciar alguns serviços. Basta confirmar com um `Yes`.

Quando terminar, teremos nosso Ubuntu pronto. Ou quase. Falta atualizar o Git no Ubuntu.

Para atualizar o Git no Ubuntu, devemos adicionar um PPA:

* `sudo add-apt-repository ppa:git-core/ppa`. Ele vai pedir para confirmar pressionando o `Enter`.

Quando finalizar, entre com o comando de update:

* `sudo apt update; sudo apt install git`

Obs: pra quem não manja, `sudo` é uma abreviação para `super user do`. Um jeito verboso de deixar explícito uma elevação para executar scripts.

# 2. Instalando o Cmder <a name="2-instalando-o-cmder"></a>

Porque o cmder?
Cmder é um emulador de terminais para Windows. Por ser um emulador, podemos rodar diversas instâncias dele, podendo brincar com bash, cmd, powershell e... zsh, claro!

Para instalar, vamos utilizar o Chocolatey:

* Volte no PowerShell rodando como Administrador, e execute o comando `choco install cmder`. Ele vai perguntar se você deseja rodar o script. Confirme com o comando `A` (yes to All).

* Navegue até o diretório `C:\Windows\cmder`, e abra o arquivo `Cmder.exe`. Este é o executável do cmder. Execute-o.

Obs: Chocolatey é o equivalente do Homebrew pro MacOS: um package manager exclusivo pro sistema operacional. Recomendo bastante, por facilitar a instalação de aplicativos e updates gerais (exemplo: dar update no nodejs, utilizando o chocolatey).

Agora que temos "a base" pronta, as coisas começam a ficar interessante.

# 3. Instalando o oh-my-zsh <a name="3-instalando-o-oh-my-zsh"></a>

* Volte para o terminal do Ubuntu, e execute o comando `sudo apt-get install zsh`. Ele vai pedir confirmação. Confirme com o `Y`.

* Abra o seu VSCode e instale a extensão do `Remote - WSL`. Depois de instalado, feche o VSCode.

Agora que instalamos o zsh, precisamos torná-lo como terminal padrão na execução do shell. É muito importante este passo. Se não configurado corretamente, o cmder vai abrir o bash padrão ao invés do zsh.

* No terminal do Ubuntu, digite o seguinte comando pra abrir o arquivo do bash no VSCode: `code ~/.bashrc`. Se ele pedir, libere o VSCode no firewall.

* Dentro do arquivo, adicione na primeira linha o script a seguir:

```markdown
# if running in terminal...
if test -t 1; then
# ...start zsh
exec zsh
fi
```

Obs: Tem que ser na primeira linha, mesmo. Se fizer no final do arquivo, pode conflitar com outra condição.

Salve o arquivo, feche-o e feche também o VSCode.

* No terminal do Ubuntu, execute o seguinte comando para instalar o oh-my-zsh: 

`sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"`

Ele vai pedir para confirmar o Zsh como shell padrão. Confirme com um `Y` e sua senha.

Obs: Ele vai instalar a pasta do oh-my-zsh no caminho `/home/<username>/.oh-my-zsh`.

# 4. Configurando o oh-my-zsh no cmder <a name="4-configurando-o-oh-my-zsh-no-cmder"></a>

Abra o cmder. Agora vamos configurar para ele virtualizar o bash com oh-my-zsh conforme a nossa necessidade.

* No comander, aperte os atalhos `Window + Alt + T`. Ele vai abrir as taks do cmder. Caso queira, pode abrir pela Barra Superior da Janela do Cmder: 

`Barra cmder > clique com o botao direito do mouse > Settings > Startup > Task`

* Dentro de Task, Clique no sinal de `+` que tem debaixo do botão 'Reload'. Ele vai criar uma nova configuração, com o nome de 'GroupN', geralmente Group10. 

* Configure do seguinte jeito: No nome, coloque `oh-my-zsh`. Marque as opções `Default task for new console`, `Taskbar jump lists` e `Default shell`. Na caixa de Task Parameters, entre com o valor `/icon %USERPROFILE%\AppData\Local\lxss\bash.ico` para ícone, e na caixa maior debaixo, coloque o valor `*cmd /c C:\Windows\System32\bash.exe ~ -new_console:p:%USERPROFILE%`. 

* Na caixa com as opções, selecione a `{oh-my-zsh}`, e mova ela pra primeira opção, utilizando o botão `Up`, próximo aos botões `+` e `-`. Coloque-o na primeira posição da fila. Clique em `Save settings` em seguida. As settings vão fechar. 

* Reinicie o cmder. Você vai perceber, que ele abre por padrão o cmd do Windows. Abra uma nova aba, com o atalho `CTRL + T`. Perceba que ele vai vir com o {oh-my-zsh} pré selecionado. Confirme com o `Enter`. Uma nova aba será aberta com o oh-my-zsh pronto.

Agora: aos plugins!

# 5. Customizando o oh-my-zsh <a name="5-customizando-o-oh-my-zsh"></a>

Instalando as cores do Dracula no cmder:

* Abra o site do Dracula e baixe o arquivo .zip do tema para o cmder: `https://draculatheme.com/cmder/`.

* Extraia o arquivo `Dracula.xml` para dentro da pasta do cmder `C:\Windows\cmder`.

* Abra as settings do cmder `WINDOW + ALT + P`, clique no botão `Import` no rodapé da página e escolha o arquivo `Dracula.xml`. Clique em Save settings e reinicie o cmder.

Agora, precisamos instalar a fonte Fira Code, para usar os símbolos contidos nela.

* Vamos usar o chocolatey para isso: Abra o PowerShell como administrador, e execute o comando: `choco install firacode`. Ele vai pedir a permissão para rodar todos os scripts. Confirme com `A` para executar todos.

* De volta no cmder, abra as settings `WINDOW + ALT + P`. Navegue até `General > Fonts`, e escolha na lista, a fonte `Fira Code`. Salve em seguida e reinicie o cmder.

Agora, vamos instalar o tema Spaceship:

* De volta no cmder, execute o comando `git clone https://github.com/denysdovhan/spaceship-prompt.git "$ZSH_CUSTOM/themes/spaceship-prompt"
`. 

* Se tudo ocorreu corretamente, ele clonou o repo do tema e colocou dentro da pasta de temas do zsh `$ZSH_CUSTOM/themes/`. Para conferir, abra a estrutura de pastas do WSL Ubuntu. Para isso, no explorer do Windows, digite o caminho `\\wsl$`.

"Fucking magic, right?" - Agora você sabe que o WSL se comporta feito um computador remoto na sua rede, mas dentro do seu próprio Windows. ;)

* Entre no diretório `\\wsl$\Ubuntu\home\<username>`. Você consegue "arrastar" o diretório da barra de busca, e deixar como atalho no Acesso Rápido.

Mas pq fazer isso? Desse jeito, você consegue utilizar a estrutura de pastas do WSL, como se fosse a sua estrutura de pastas do Windows. Imagine que, assim como eu, você usa o mesmo computador para lazer - jogos - e trabalho. Desse jeito, você fica com duas estrutura separando o que é pessoal, do que é profissional. =)

* Abra a pasta `\\wsl$\Ubuntu\home\<username>\.oh-my-zsh\custom\themes` e veja se a pasta do tema `spaceship-prompt` foi criada com sucesso. Se foi, vamos prosseguir.

* No cmder, execute o próximo comando: `ln -s "$ZSH_CUSTOM/themes/spaceship-prompt/spaceship.zsh-theme" "$ZSH_CUSTOM/themes/spaceship.zsh-theme"`. Ele vai linkar o tema ao oh-my-zsh.

* Agora abra o arquivo de configuração do oh-my-zsh, com o seguinte comando: `code ~/.zshrc`. Ele vai abrir no VSCode. Procure por `ZSH_THEME` e substituia o valor entre aspas para `"spaceship"`. Salve o arquivo, e reinicie o cmder.

Obs: se você navegar até a pasta `~/.oh-my-zsh`, você vai perceber a fonte Fira Code ativa, mostrando o branch do git.

Agora, bora pros 3 plugins "de lei".

* Primeiro, vamos instalar um plugin, que facilita a instalação de demais plugins. (sério, as vezes ele falha o clone pra pasta correta, e ai você tem que ficar corrigindo na mão. é um saco isso, e acontece até no macOs. Instala o plugin). Para instalar, execute o comando `sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zplugin/master/doc/install.sh)"`

Lá no arquivo `~/.zshrc` que deixamos aberto no VSCode, ele vai adicionar algumas linhas no fim do arquivo.

* Vá no final do arquivo, e adicione as seguintes linhas: 
`zplugin light zdharma/fast-syntax-highlighting`
`zplugin light zsh-users/zsh-autosuggestions`
`zplugin light zsh-users/zsh-completions`

* Salve em seguida e reinicie o cmder. Ele vai instalar os plugins e pedir confirmação para executar os scripts. Confirme com o `Y`.

# 6. Conclusão <a name="6-conclusao"></a>

Agora você possui o oh-my-zsh rodando em seu cmder, porém não limitado somente a ele: o terminal do Ubuntu e o VSCode também vão utilizar do oh-my-zsh como terminal padrão de uso. Com isso, você pode usufruir do mesmo tema Drácula/Spaceship e funcionalidades de autocompletion, git branches e o que mais você adicionar de plugin.

Ele também traz atalhos de teclado, que são bastante interessante. Quando o autocompletion te trouxer algum valor, basta usar a seta pra direita no teclado, que ele vai completar o código automaticamente, deixando bem dinâmico o processo.

Espero que curtam e que tenham um bom proveito com esse kit poderoso. Gastei algumas horas de um sábado tedioso pra aprender a colocar tudo isso junto funcionando no Windows e como configurar da maneira mais simples possível.

Usei referências da [Rocketseat](https://blog.rocketseat.com.br/terminal-com-oh-my-zsh-spaceship-dracula-e-mais/), de um texto do [Nuno Caneco](https://medium.com/@nuno.caneco/zsh-running-on-cmder-498353a1495d), e outras referencias de stackoverflow que encontrei por aí.

Obrigado aos meus amigos principalmente, por revisarem o conteúdo! ♥

E é isso aí, turma. Quem quiser me seguir e trocar ideia sobre dev, só chegar mais, são todos bem vindos

Um abraço!