Configuração meu Neovim
Aqui se encontram a estrutura e configuração do meu Neovim que implementei
Por que usar Lua para configurar o Neovim?
Estrutura de Diretórios
A estrutura do Neovim com Lua segue um padrão modular que separa configurações por categoria:
- init.lua
- lazy-lock.json
- .luarc.json
Directorylua/
Directoryconfig/
- autocmds.lua
- keymaps.lua
- lazy.lua
- options.lua
- theme.lua
Directoryplugins/
- init.lua
Directorygit-manager/
- …
Directoryinterface/
- …
Directorylsp/
- …
Directorymarkdown/
- …
Directoryprogramming/
- …
Arquivo Principal: init.lua
O init.lua é o ponto de entrada da configuração. Ele deve ser minimalista, delegando o trabalho para módulos menores:
-- Habilita o cache de módulos Lua (ganho enorme no startup do Neovim 0.9+).if vim.loader and vim.loader.enable then vim.loader.enable()end
-- Leader keys devem ser definidos antes de qualquer plugin spec ser carregado.vim.g.mapleader = " "vim.g.maplocalleader = " "
-- Carrega os módulos de configuração.require("config.options")require("config.lazy")require("config.keymaps")require("config.autocmds")Por que essa ordem?
- options primeiro: Configurações básicas que não dependem de plugins
- lazy depois: Plugin manager precisa estar carregado antes dos plugins
- keymaps: Mapeamentos que funcionam sem plugins específicos
- autocmds: Eventos que dependem de outras configurações
Módulos de Configuração (lua/config/)
options.lua
Configurações puras do Neovim que não requerem plugins:
local opt = vim.opt
-- Indentaçãoopt.expandtab = true -- converte tabs para espaçosopt.tabstop = 2 -- largura visual de um tabopt.softtabstop = 2 -- espaços inseridos ao pressionar <Tab>opt.shiftwidth = 2 -- espaços usados para auto-indentopt.autoindent = true -- copia indent da linha atualopt.smartindent = true -- indentação inteligente para novas linhas
-- UIopt.number = true -- mostra números de linha absolutosopt.relativenumber = false -- defina true para números híbridosopt.cursorline = true -- destaca linha atualopt.signcolumn = "yes" -- sempre renderiza sign columnopt.termguicolors = true -- cores 24-bitopt.showmode = false -- modo é mostrado pelo lualinelazy.lua
Bootstrap do plugin manager lazy.nvim:
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"if not (vim.uv or vim.loop).fs_stat(lazypath) then vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath, })endvim.opt.rtp:prepend(lazypath)
require("lazy").setup({ spec = { { import = "plugins" }, -- Importa todos os plugins de lua/plugins/ }, defaults = { lazy = false, -- plugins opt-in para lazy loading version = false, -- sempre usa latest commit }, performance = { cache = { enabled = true }, rtp = { disabled_plugins = { "gzip", "tarPlugin", "tohtml", "tutor", "zipPlugin", "netrwPlugin", "matchit", "matchparen", "spellfile", }, }, },})keymaps.lua
Mapeamentos globais que não dependem de plugins específicos:
local map = function(mode, lhs, rhs, opts) opts = vim.tbl_extend("force", { silent = true }, opts or {}) vim.keymap.set(mode, lhs, rhs, opts)end
-- Navegação de janelasmap("n", "<C-h>", "<C-w>h", { desc = "Window: move left" })map("n", "<C-j>", "<C-w>j", { desc = "Window: move down" })map("n", "<C-k>", "<C-w>k", { desc = "Window: move up" })map("n", "<C-l>", "<C-w>l", { desc = "Window: move right" })
-- Limpar highlight de buscamap("n", "<Esc>", "<cmd>nohlsearch<cr>", { desc = "Clear search highlight" })autocmds.lua
Autocomandos leves para eventos do Neovim:
-- Destaca brevemente a região copiadavim.api.nvim_create_autocmd("TextYankPost", { group = augroup("highlight_yank"), callback = function() vim.highlight.on_yank({ timeout = 150 }) end,})
-- Remove espaços em branco ao salvar (exceto markdown)vim.api.nvim_create_autocmd("BufWritePre", { group = augroup("trim_whitespace"), callback = function() if vim.bo.filetype == "markdown" or vim.bo.filetype == "mdx" then return end local save = vim.fn.winsaveview() vim.cmd([[keepjumps %s/\s\+$//e]]) vim.fn.winrestview(save) end,})theme.lua
Paleta de cores compartilhada usada por todos os plugins:
return { -- Backgrounds bg = "#0d0d0d", -- background primário bg_alt = "#0d0d0d", -- superfícies elevadas bg_float = "#0d0d0d", -- janelas flutuantes
-- Foregrounds fg = "#c9d1d9", -- texto primário fg_strong = "#e6edf3", -- títulos, elementos focados fg_muted = "#6e7681", -- comentários, hints
-- Semantic accents green = "#3fb950", -- sucesso, adições blue = "#58a6ff", -- info, links orange = "#e8912d", -- warnings red = "#ff7b72", -- erros, deleções yellow = "#d29922", -- caution, modificações purple = "#bc8cff", -- C# / .NET accent}Sistema de Plugins (lua/plugins/)
plugins/init.lua
Loader que importa grupos de plugins:
return { { import = "plugins.interface" }, { import = "plugins.lsp" }, { import = "plugins.markdown" }, { import = "plugins.programming" }, { import = "plugins.git-manager" },}Organização por Categoria
Cada categoria é um diretório com arquivos .lua individuais para cada plugin:
- interface/: Plugins de UI (telescope, neotree, dashboard, etc.)
- lsp/: Plugins LSP (nvim-lspconfig, mason, nvim-dap)
- programming/: Plugins de desenvolvimento (cmp, neotest, comment, etc.)
- git-manager/: Plugins Git (gitsigns, lazygit)
- markdown/: Plugins específicos para Markdown
Como Configurar o Neovim para Ler Arquivos Lua
-
Crie o diretório de configuração
Criando diretório no Windows mkdir $env:LOCALAPPDATA\nvimCriando diretório no Linux mkdir -p ~/.config/nvim -
Crie o arquivo init.lua
Criando init.lua no Windows New-Item -Path "$env:LOCALAPPDATA\nvim\init.lua" -ItemType FileCriando init.lua no Linux touch ~/.config/nvim/init.lua -
Adicione a estrutura de diretórios
Criando estrutura no Windows mkdir $env:LOCALAPPDATA\nvim\luamkdir $env:LOCALAPPDATA\nvim\lua\configmkdir $env:LOCALAPPDATA\nvim\lua\pluginsCriando estrutura no Linux mkdir -p ~/.config/nvim/lua/configmkdir -p ~/.config/nvim/lua/plugins -
Copie os arquivos de configuração
Copie os arquivos do seu repositório Neovim para os diretórios correspondentes.
-
Reinicie o Neovim
Reiniciando Neovim nvimO lazy.nvim instalará automaticamente os plugins na primeira execução.