Criando plugins Lua para Neovim - Parte 1
Tags: neovim, plugins, vim, lua
Published: 2022-05-09 17:17:38

> Uma série mostrando um passo a passo na criação de plugins Lua para o Neovim

---


Desde que migrei para o Neovim em 2019, depois passar 8 anos usando vim com seus plugins fantásticos, comecei a descobrir as motivações que levaram os core devs a criar esse fork.

Podemos ficar um bom tempo aqui falando sobre elas (e você pode ver uma palestra muito interessante sobre [clicando aqui](https://www.youtube.com/watch?v=Bt-vmPC_-Ho)), mas o intuito desde texto é apenas destacar uma delas, e a que eu considero uma das mais importantes: **Lua**

Quando você instala o Neovim hoje, a linguagem Lua, ou mais especificamente o **_LuaJIT_**, uma versão otimizada da linguagem está inserida no core e você consegue usá-la diretamente num vimscript ou chamando um arquivo lua diretamente. Mas como isso acontece?

Esse texto vai fazer parte de uma série onde vou mostrar como é possível criar seu primeiro plugin para o Neovim usando puramente Lua. Primeiro vamos voltar um pouco e mostrar a estrutura de um plugin convencional para o Vim:

```
~/seu-plugin/
|--plugin/
|--ftplugin/
|--after/
|--autoload/
```
Para nossa série, iremos focar na pasta `plugin` por enquanto.

A pasta `plugin` é usada como ponto de entrada no carregamento do vim. Lá é o lugar onde irão viver os plugins globais. Guarde essa informação pois ela vai ser importante na criação do nosso plugin.

## Criando nosso hello-world.nvim plugin

TL;DR : Código para o plugin da primeira parte [aqui](https://github.com/ellisonleao/criando-plugins-lua-neovim)

Como não utilizaremos de nenhum gerenciador de plugins nessa série, vamos facilitar um pouco o carregamento do mesmo e iremos criar os arquivos diretamente no [runtimepath](https://neovim.io/doc/user/options.html#'runtimepath') do neovim, mais precisamente em

```
~/.local/share/nvim/site/plugin
```

Caso essa pasta não exista em seu sistema, crie com

```
$ mkdir -p ~/.local/share/nvim/site/plugin
```

Nosso plugin irá utilizar a versão 0.7 (stable até o momento) do neovim.

Dentro da pasta plugin crie a pasta `hello-world.nvim` e a subpasta `plugin`.

```
$ mkdir -p hello-world.nvim/plugin
```

Desde a versão 0.6, podemos executar scripts lua diretamente da pasta `plugin`. Quando falamos no início do post sobre essa pasta e o valor especial que ela tem, estamos falando justamente sobre o ponto de partida do plugin. Se o seu plugin precisa ser carregado toda vez que o neovim abre, o código do seu projeto precisa ser inicializado ou feito diretamente na pasta `plugin`. 

Dentro da pasta, crie o arquivo `hello-world.lua` e digite:

```lua
vim.api.nvim_create_user_command("HelloWorld", function() print("hello world lua!") end, {})
```

Podemos ver o uso do `vim.cmd`, uma ponte entre lua e a chamada da função ou de um comando vimscript. Iremos explicar mais exemplos dele e outras APIs, como o `vim.api`, a mais importante delas.

Agora você pode reiniciar o editor e testar o novo plugin. Depois de fechar e abrir, digite:

```
:HelloWorld
```

e poderá ver no prompt de comando a mensagem

`hello world lua!`

## Conclusão

Esta é só a ponta do iceberg do que podemos fazer com Lua no neovim hoje. Nos próximos posts da série iremos abordar como criar floating windows, configurar seu Neovim para usar o LSP nativo (~~e fugir daquele plugin javascript que você deseja tanto~~) e no fim da série vou explicar como migrar seu vimfiles totalmente para lua usando o máximo de plugins puramente feitos em lua no dia-a-dia (sim, isso já é possível!)

Aguardem os próximos posts e não esqueçam de seguir nossas redes

## Links Úteis

- [Documentação Oficial Neovim e Lua](https://neovim.io/doc/user/lua.html)


## Para ouvir

{% embed https://www.youtube.com/watch?v=-xKgOYIGXo4 %}