Esse é o segundo artigo da série Tudo sobre Neovim com Lua, se você não leu o anterior segue o link aqui.
Dica: se você possui os diretórios
nvim
tanto em~/.local/share
como em~/.config
remova-os ou faça backup porque aqui mostraremos do zero. Exemplo:rm -rf ~/.config/nvim ~/.local/share/nvim
Todos nós sabemos que o arquivo principal de configuração do Vim é o ~/.vimrc
e o arquivo correspondente dele no Neovim é o ~/.config/nvim/init.vim
. Ou seja, se criarmos um link simbólico do vimrc para o init.vim seu Neovim funcionará normalmente como seu Vim funciona e você também portará todas as configurações e plugins para o Neovim.
Mas e se você quiser rodar Lua a partir desse init.vim é possível ? Sim, para isso você precisará usar Here String .
Exemplo, vamos supôr que você deseja exibir uma mensagem no rodapé assim que abrir o Neovim, mas essa mensagem precisa ser entregue com a linguagem de programação Lua. Bastava você adicionar esse código ao seu init.vim
:
lua <<EOF
print("Olá, usuário! Seja bem-vindo ao Neovim!")
EOF
Agora, toda vez que você abrir seu Neovim aparecerá essa mensagem no rodapé:
Dá pra fazer isso com o Vim também ? Se você tiver compilado seu vim com suporte a Lua ou adicionado o pacote vim-lua para sistemas que oferencem binários, sim é possível! Mas o Vim faz uma ponte já o Neovim é de forma nativa, ou seja, já há uma boa diferença e no Vim você deverá usar assim(como comando): :lua <<EOF
com dois pontos na frente.
init.lua
Mas, em vez de usar Here String você pode usar Lua diretamente, e isso deve ser feito no init.lua
. Para utilizá-lo, remova seu init.vim
e crie um init.lua
.
Observação: Não renomeie e nem use os dois(haverá erro) porque agora o inverso também não funciona, ou seja, comandos do VimScript não rodam diretamente no
init.lua
.
E para exibir aquela mesma mensagem, basta fazer assim:
print("Olá, usuário! Seja bem-vindo ao Neovim!")
init.lua
Como havíamos dito no artigo anterior dessa série o Neovim utiliza API do Vim para entregar os resultados ou consultar comandos e executá-los e para esse caso utiliza a API vim.cmd
.
Então, com Lua basta rodar assim, por exemplo, tornar o cursor Beam no modo normal, adicione isso ao seu init.lua
:
vim.cmd([[ set guicursor= ]])
Você pode pôr todas as configurações do seu Vim dentro dessa função que irá funcionar normalmente.
Se você quiser criar um arquivo separado com suas configurações e importá-lo para seu init.lua
fica mais organizado, exemplo: criar um arquivo settings.lua
e no seu init.lua
basta adicionar essa linha:
require("settings")
O mais correto mesmo é você criar um diretório de nome lua/ e dentro dele pôr todos os arquivos que serão importados pelo init.lua
, exemplo:
mkdir -p ~/.config/nvim/lua
E mover o settings.lua
para lá:
mv ~/.config/nvim/settings.lua ~/.config/nvim/lua/
E o init.lua
irá automáticamente ler o settings.lua
mesmo sem indicar o diretório porque isso faz parte do 'runtimepath'
, ou seja, esse diretório de nome lua/ faz parte do padrão.
Você pode organizar da forma que bem entender, mas há uma organização padrão. No momento não sabemos ainda tudo que precisaremos criar, mas nos próximos artigos veremos mais detalhes e a documentação do Neovim propões essa hieraquia de organização:
📂 ~/.config/nvim
├── 📁 after
├── 📁 ftplugin
├── 📂 lua
│ ├── 🌑 myluamodule.lua
│ └── 📂 other_modules
│ ├── 🌑 anothermodule.lua
│ └── 🌑 init.lua
├── 📁 pack
├── 📁 plugin
├── 📁 syntax
└── 🇻 init.vim
Note: Que nessa hieraquia é mantido o arquivo
init.vim
, mas há uminit.lua
dentro do diretório lua, mas isso é baseado se você ainda não está usando oinit.lua
como principal, ou seja, essa é para a fase de transição e lógico que isso é o padrão, mas não necessariamente uma regra.
Aqui na nossa série vamos fazer similar, mas não igual, até porque nem todos esses arquivos utilizaremos.
Nessa altura você já pensa como entregar para Lua resultados do VimScript. Por exemplo, nesse vídeo nós obtivemos a extensão do arquivo que é aberto toda vez que usamos o editor para escolhermos qual plugin carregar.
Bom, obter a extensão com Lua é uma coisa, mas obter a extensão que o Neovim vai abrir é outra. Sabemos que poderíamos usar o vim.cmd
, mas como armazenar a saída para manipularmos com Lua ?
Vamos criar um arquivo novo no diretório lua/ de nome nvim lua/tools.lua
e dentro dele vamos pôr esse código:
Analise os comentários no código para uma maior compreensão.
vim.cmd([[ let extension = expand('%:e') ]]) -- criamos a variável no ambiente da API
function get_extension( var ) -- recebe o argumento para a variável
return vim.api.nvim_get_var( var ) -- retornamos a variável
end
local ext = get_extension("extension") -- dizemos qual o nome da variável que queremos
print("A extensão desse arquivo é: " .. ext) -- usamos a extensão como quisermos
Agora abra seu init.lua
e importe o tools.lua
assim somente:
nvim init.lua
require("settings")
require("tools") -- para o novo arquivo
Agora qualquer arquivo que nós abrirmos com o Neovim ele nos dirá no rodapé a extensão. Simples, né?!
Esse exemplo foi bem básico e fácil principalmente se você já conhece de Lua, mas os plugins usam bastante tabelas
e metatabelas
, no entanto, não foge muito da simplicidade!
Para mais informações rode no seu Neovim: :h vim.api
.