Configurando NeoVim + Elixir
Tags: elixir
Published: 2024-05-21 18:20:25

---
title: Configurando NeoVim + Elixir
published: true
description: 
tags: elixir
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hn09fwbtikn0npdrjj4d.png
---

## Introdução

De idas e vindas acabei trabalhando muito tempo com elixir no VS Code. Até então tudo certo. De um tempo para cá, comecei a sentir lentidão no autocomplete e dificuldade de utilizar algumas ferramentas. Isso me levou a fazer essa pergunta no twitter / X.

{% twitter 1791535928894230872%} 

Trabalhei a alguns anos atrás com VIM e no geral gostava dele, mas achava complexo a configuração e customização. Com isso em mente fui ver como funcionava a configuração do `Nvim` que muitos comentaram na thread. Fui atras também de um jeito fácil de configurar e encontrei o `Astronvim` que me interessou bastante. Tendo isso em mãos, iniciei o setup.

## Configuração

* NeoVim
* AstroNvim
* Elixir-tools

## Instalações

### Requisitos

| Requisitos | Versão   |
|------------|----------|
| neovim     | 0.9.5+   |

### NeoVim

A versão estável atual do Nvim é o 0.7.x, porém, Astronvim pede 0.8+. Isso buscando das versões não estáveis. Tendei diretamente pelo repositório [unstable](https://launchpad.net/~neovim-ppa/+archive/ubuntu/stable) e instalar a versão `nighty`. Porém, me trouxe muitos problemas que não tive paciência para ir em frente. Foi então que me lembrei do gerencias [asdf](https://asdf-vm.com/) e por ele ficou mais simples

Repositório: https://github.com/richin13/asdf-neovim

```sh
asdf plugin add neovim
asdf install neovim 0.10.0
```

Feito. Nvim instalado. Porém, se você rodar o nvim agora, ele vai receber o erro

```
No version is set for command nvim
```

Precisamos definir a versão padrão para a ferramenta. Caso não exista, precisamos criar o arquivo no root do seu usuário. `~/.tool-versions` e adicione no conteúdo a ferramenta e a versão

```
neovim 0.10.0
```

Com isso, podemos rodar o comando e abrir a ferramenta

```
nvim
```

## AstroNvim

Astro é uma ferramenta que une extensibilidade com gerenciamento de plugin utilizando o Mason. Ele facilita a adição de novos plugins e o gerenciamento de dependencia e configurações, por isso decidi usar ele.

E tive uma boa impressão. ele é simples de rodar, basta seguir o guia oficial e tudo funciona como deveria.

A configuração é simples

```shell
git clone --depth 1 https://github.com/AstroNvim/template ~/.config/nvim # baixa e coloca a configuração no local certo
rm -rf ~/.config/nvim/.git # Remove o .git do que foi clonado
```

Depois disso, bastou rodar o nvim e ele já saiu funcionando

```
nvim
```

Você pode receber o erro que não encontrou o compilador C. Para isso precisa ter as dependêmncias base. No linux temos o pacote essencial.

```
 sudo apt-get install build-essential 
```

Depois disso só abrir novamente o `nvim` e o erro deve ter sumido.

![Nvim rodando](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gick2ndmkty5lax3rpci.png)

Ao abrir, ele começa a instalar as dependências automaticamente. Lindo demais <3

Talvez você tenha problema com a font e icones. Para isso, instale a nerdfonts no [link](https://www.nerdfonts.com/font-downloads). 

Eu instalei a font 0xProto Nerd Font e ficou bom para mim =D

### Elixir-tools

Precisei adicionar suporte a linguagem. Para minha surpresa, foi fácil. Existe esse plugin para `NeoVim` que da suporte a tudo que precisamos do elixir o [Elixir-tools](https://github.com/elixir-tools/elixir-tools.nvim)

Para isso precisamos acessar a pasta de configuração do `nvim`, mesmo lugar que fizemos o clone do astro.

```
cd ~/.config/nvim
```
Essa é a estrutura das configurações

```
.nvim/
├─ lua/
│  ├─ plugins/
│  │  ├─ ...
│  ├─ community.lua
│  ├─ lazy_setup.lua
│  ├─ polish.lua
.neoconf.json
.stylua.toml
init.lua
lazy-lock.json
neovim.yml
README.md
selene.toml
```

De forma visual, fica fácil saber onde adicionar um plugin, não? Criei um novo arquivo dentro de `.nvim/lua/plugins/` e o chamei de `elixir.lua`.

Dentro da documentação do plugin elixir-tools, tem uma seção de [configuração usando o lazy.nvim](https://github.com/elixir-tools/elixir-tools.nvim?tab=readme-ov-file#lazynvim), resolvi usar ele. 

```lua
{
  "elixir-tools/elixir-tools.nvim",
  version = "*",
  event = { "BufReadPre", "BufNewFile" },
  config = function()
    local elixir = require("elixir")
    local elixirls = require("elixir.elixirls")

    elixir.setup {
      nextls = {enable = true},
      credo = {},
      elixirls = {
        enable = true,
        settings = elixirls.settings {
          dialyzerEnabled = false,
          enableTestLenses = false,
        },
        on_attach = function(client, bufnr)
          vim.keymap.set("n", "<space>fp", ":ElixirFromPipe<cr>", { buffer = true, noremap = true })
          vim.keymap.set("n", "<space>tp", ":ElixirToPipe<cr>", { buffer = true, noremap = true })
          vim.keymap.set("v", "<space>em", ":ElixirExpandMacro<cr>", { buffer = true, noremap = true })
        end,
      }
    }
  end,
  dependencies = {
    "nvim-lua/plenary.nvim",
  },
}
```

Já de cara da de ver que podemos configurar o que for necessário. Mas deixei ele padrão por hora.

Dentro do arquivo `.nvim/lua/plugins/elixir.lua` adicionei a configuração para o lazy e um retorno para devolver a configuração

```lua
return {
  "elixir-tools/elixir-tools.nvim",
  version = "*",
  event = { "BufReadPre", "BufNewFile" },
  config = function()
    local elixir = require("elixir")
    local elixirls = require("elixir.elixirls")

    elixir.setup {
      nextls = {enable = false},
      credo = {},
      elixirls = {
        enable = true,
        settings = elixirls.settings {
          dialyzerEnabled = false,
          enableTestLenses = true,
        },
        on_attach = function(client, bufnr)
          vim.keymap.set("n", "<space>fp", ":ElixirFromPipe<cr>", { buffer = true, noremap = true })
          vim.keymap.set("n", "<space>tp", ":ElixirToPipe<cr>", { buffer = true, noremap = true })
          vim.keymap.set("v", "<space>em", ":ElixirExpandMacro<cr>", { buffer = true, noremap = true })
        end,
      }
    }
  end,
  dependencies = {
    "nvim-lua/plenary.nvim",
  },
}
```

feito isso, fechei meu nvim e abri ele diretamente em um arquivo elixir.

```
nvim some_place/file.ex
```

Ele começou a perguntar se queria instalar o 

* nextls 
* Credo Language Server
* ElixirLS
 
E eu, so aceitei. Feito isso, tudo funcionou bem.

![NVim funcionando](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u4ga0ngepn8wk9jxsyd1.png)

## Problemas

* Versão do NeoVim 0,11+ me dava muitos warnings que resolvi voltando para a 0.10 usando asdf
* Tive problema de permissão também, resolvido mudando a permissão da pasta.

## Agradecimentos

A thread teve vários comentários e queria agradecer todos que participaram <3