meu setup neovim em 2026
Uso Neovim como editor principal faz uns dois anos. A cada poucos meses eu reviso a config, tiro o que não uso, e de vez em quando adiciono algo novo. Aqui tá o estado atual.
O básico
Minha config fica em ~/.config/nvim/ e eu gerencio plugins com lazy.nvim. A config toda dá umas ~400 linhas em alguns arquivos, nada demais.
-- bootstrap do lazy.nvim
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git", "clone", "--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
Lista de plugins
O que eu tenho instalado agora:
| Plugin | Pra que serve |
|---|---|
| telescope.nvim | fuzzy finder pra arquivos, grep, buffers |
| treesitter | syntax highlighting, text objects |
| lspconfig | setup LSP pra TS, Go, Rust |
| oil.nvim | file explorer que funciona como buffer |
| mini.surround | text objects de surround |
| gitsigns | diff do git no gutter |
Eu costumava ter muito mais coisa: nvim-tree, bufferline, lualine com config elaborada. Tirei tudo. Quanto menos UI, melhor.
Atalhos que importam
A maioria dos meus atalhos usa leader. Uso espaço como leader.
vim.g.mapleader = " "
-- arquivos
vim.keymap.set("n", "<leader>ff", "<cmd>Telescope find_files<cr>")
vim.keymap.set("n", "<leader>fg", "<cmd>Telescope live_grep<cr>")
vim.keymap.set("n", "<leader>fb", "<cmd>Telescope buffers<cr>")
-- lsp
vim.keymap.set("n", "gd", vim.lsp.buf.definition)
vim.keymap.set("n", "K", vim.lsp.buf.hover)
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename)
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action)
O negócio dos atalhos é que você só deveria mapear coisa que realmente usa. Vejo configs com 100+ mapeamentos e garanto que metade é esquecida em uma semana.
Screenshot
Assim que fica na prática, editando um arquivo TypeScript com o colorscheme gruvbox:
Config do LSP
Pra TypeScript uso ts_ls, pra Go gopls, pra Rust rust-analyzer. A config é mínima:
local lspconfig = require("lspconfig")
local servers = { "ts_ls", "gopls", "rust_analyzer" }
for _, server in ipairs(servers) do
lspconfig[server].setup({
capabilities = require("cmp_nvim_lsp").default_capabilities(),
})
end
Sem wrappers elaborados. Se o LSP suporta, o Neovim cuida. Format on save é só um autocommand:
vim.api.nvim_create_autocmd("BufWritePre", {
callback = function()
vim.lsp.buf.format({ async = false })
end,
})
O que eu mudaria
Sinceramente, não muito. A config tá estável. A única coisa que fico indo e voltando é se deveria usar conform.nvim pra formatação ao invés do formatter built-in do LSP. Por enquanto o built-in dá conta.
Se quiser ver a config completa, tá no meu repo de dotfiles.