WSL com Neovim + Tmux + WezTerm
Tags: wsl, neovim, tmux, productivity
Published: 2024-04-07 01:01:57


Recentemente me pediram para escrever um plugin para automatizar algumas tarefas no figma, e animado pelo desafio, aceitei. Eu trabalho primariamente utilizando linux, e isso se tornou um problema, pois para desenvolver o aplicativo, tenho que utilizar a versão desktop do figma, disponível apenas para Windows ou Mac. Como não tenho acesso a um Mac, precisei recorrer ao Windows. 

No começo do projeto tentei utilizar o VSCode com o plugin para ter vim motions, mas percebi que os movimentos do Vim eram apenas uma parte do processo.  Meu fluxo de trabalho normalmente se concentra inteiramente no terminal, usando Neovim, tmux e, mais recentemente, lazygit. Acostumado com o ambiente GNU/Unix, lidar com o PowerShell foi complicado, e o trabalho simplesmente não fluía bem. Aqui, compartilho minha jornada para adaptar meu fluxo de trabalho ao Windows.

> Este não é um tutorial de Neovim, para isso, recomendo ver [este vídeo](https://www.youtube.com/watch?v=m8C0Cq9Uv9o) do TJ DeVries para aprender sobre Neovim.

> Aqui eu assumo que você já tem git e WSL (Windows Subsystem for Linux) instalados, caso contrário, [veja aqui](https://learn.microsoft.com/en-us/windows/wsl/install) como instalar o WSL.

> Este fluxo de trabalho é algo que funciona para mim, pode não funcionar para você. Aproveite o que puder.

## WezTerm

O Windows Terminal é suficiente para usar tmux e neovim, mas o WezTerm é um excelente terminal multiplexer escrito em Rust e com configuração em Lua, e como já é o meu terminal de escolha no Linux, pude importar as configurações que já utilizo lá.

Para instalar, basta baixar [neste link](https://wezfurlong.org/wezterm/install/windows.html), e seguir as instruções.

O próximo passo é configurar o WezTerm para sempre abrir com o domínio WSL, e para isso, abra o PowerShell e digite `wsl -l -v`. O output será algo como:


![powershell wsl return](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g6w1dq8hbg7dpw4y4uvd.png)


Para configurar o WezTerm, é necessário criar o arquivo `.wezterm.lua` no diretório $HOME, que no windows é `C:\Users\<seu-usuário>` (quando precisar acessar utilizando a WSL, o local é `/mnt/c/Users/seu-usuário`), e inserir a seguinte configuração:

```lua
local wezterm = require("wezterm")

local config = {}

config.wsl_domains = {
	{
		name = "WSL:Ubuntu",

-- aqui abaixo coloque o resultado do comando wsl -l -v 
		distribution = "Ubuntu",
	},
}

if wezterm.config_builder then
	config = wezterm.config_builder()
end

config.default_domain = "WSL:Ubuntu"
return config
```

Salve o arquivo e reinicie o terminal. Para outras configurações, veja a referência [aqui](https://wezfurlong.org/wezterm/config/lua/general.html).
Com configurações adicionais (zsh + oh-my-zsh + Starship e estilização para o WezTerm), o resultado é este: 

![wezterm result](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pmi5gaetad16qxofsxks.png)


## tmux
Uma vez que temos o terminal configurado para rodar no WSL, podemos instalar tmux, e o processo irá variar conforme a distro escolhida. No meu caso, como instalei o Ubuntu, posso instalar usando `sudo apt install tmux`.
Não é necessária nenhuma configuração adicional para rodar o tmux com wsl, mas para rodar neovim recomendo duas configurações importantes:

- Nem sempre tmux renderiza corretamente as cores quando se roda Neovim (veja a referência no FAQ do tmux [aqui](https://github.com/tmux/tmux/wiki/FAQ#how-do-i-use-a-256-colour-terminal)). Você pode corrigir isso com o seguinte comando no arquivo `.tmux.conf`, localizado em /home/seu-usuário (caso não exista, basta criar):
```bash
set -as terminal-features ",*:RGB"
set -ag terminal-overrides ",xterm-256color:RGB"
```
- Para navegar facilmente entre as tmux-panes e as panes do Neovim, é interessante configurar os seguintes atalhos (obrigado, [typecraft](https://www.youtube.com/@typecraft_dev)!):

```bash
# configura o comando "prefixo+r" para recarregar a configuração do tmux
unbind r
bind r source-file ~/.tmux.conf

# configura o prefixo para "ctrl+s"
set -g prefix C-s

# configura para movimentar entre as panes usando "prefixo+letra indicada"
bind-key h select-pane -L
bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R
```

## Neovim

Para usar o Neovim, prefiro sempre montar a partir do código-fonte, pois fica sempre fácil de atualizar apenas com `git fetch && git pull`. Você também pode instalar utilizando a `ppa` oficial, mas aqui usarei o código-fonte.

1. **Instale as dependências:**
`sudo apt-get install ninja-build gettext cmake unzip curl build-essential`

2. **Baixe o Neovim em seu diretório de repositórios:**
`git clone https://github.com/neovim/neovim`

3. **Faça o build:**
`cd neovim && make CMAKE_BUILD_TYPE=RelWithDebInfo`
A partir daqui você pode instalar com `sudo make install` e depois mover o arquivo nvim para /usr/bin (ou seu local padrão de aplicações) ou com `cd build && cpack -G DEB && sudo dpkg -i nvim-linux64.deb` para criar um arquivo `.deb` e instalar (caso sua distro seja baseada em Debian). No meu caso, prefiro criar o arquivo e instalar, pois caso seja necessário remover, fica muito mais fácil de desinstalar do sistema.

Com tudo instalado e configurado, você poderá ter uma experiência muito parecida a de um sistema Unix!


![resultado final](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/96lnjs92kh591e1z9ux1.png)


Caso queira ver minhas configurações completas, pode acessar meu [dotfiles](https://github.com/pedro-hga/dotfiles) e minhas configurações do [Neovim](https://github.com/pedro-hga/nvim).

Você pode também ver meu portfolio aqui: https://pedro-hga.com

Happy coding!