🧩 Exercícios: Configuração do Neovim com Lua, Treesitter e LSP
Extra Guia de Ferramentas • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 6.1 — Configuração de Opções Básicas em Lua (options.lua)
Contexto: Configurar números de linha relativos, indentação de 4 espaços por tab, termo de cores TrueColor (24-bit) e cópia direta para o clipboard do sistema operacional no Neovim.
Resultado Esperado
-- lua/config/options.lua
local opt = vim.opt
opt.number = true
opt.relativenumber = true
opt.tabstop = 4
opt.shiftwidth = 4
opt.expandtab = true
opt.termguicolors = true
opt.clipboard = "unnamedplus"
opt.cursorline = true
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
options_SeuNome.lua - Envie na tarefa:
Atividade Cap 06 - Neovim em Lua
🔑 Gabarito de Código & Solução Comentada
local opt = vim.opt
opt.number = true
opt.relativenumber = true
opt.tabstop = 4
opt.shiftwidth = 4
opt.expandtab = true
opt.termguicolors = true
opt.clipboard = "unnamedplus"
opt.cursorline = true
Comentário: A opção clipboard = "unnamedplus" integra os comandos de yank (y) e paste (p) diretamente com a área de transferência do Windows/Linux/macOS.
🎯 Nível 2: Prática
Problema 6.2 — Bootstrap Automatizado do Lazy.nvim em Lua
Escreva o script de bootstrap lua/config/lazy.lua que clone o repositório do lazy.nvim caso não exista localmente e inicialize o gerenciador de plugins.
🔑 Gabarito de Código & Solução Comentada
-- lua/config/lazy.lua
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)
require("lazy").setup("plugins")
🎯 Nível 3: Integração
Problema 6.3 — Configuração Declarativa do Treesitter com Destaque e Autotag
Configure o plugin nvim-treesitter via Lazy.nvim para instalar automaticamente parsers de python, lua, javascript, html e markdown, habilitando destaque semântico e indentação inteligente.
🔑 Gabarito de Código & Solução Comentada
-- lua/plugins/treesitter.lua
return {
"nvim-treesitter/nvim-treesitter",
build = ":TSUpdate",
event = { "BufReadPost", "BufNewFile" },
config = function()
require("nvim-treesitter.configs").setup({
ensure_installed = { "python", "lua", "javascript", "typescript", "html", "markdown", "markdown_inline" },
sync_install = false,
auto_install = true,
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
},
indent = { enable = true },
})
end,
}
🎯 Nível 4: Desafio
Problema 6.4 — Configuração Unificada de LSP com Mason e Mapeamento de Atalhos
Escreva o arquivo lua/plugins/lsp.lua configurando mason.nvim, mason-lspconfig.nvim e nvim-lspconfig com keymaps globais ativados via autocmd LspAttach para: gd (Go to Definition), K (Hover Docs), <leader>ca (Code Action) e <leader>rn (Rename).
🔑 Gabarito de Código & Solução Comentada
-- lua/plugins/lsp.lua
return {
"neovim/nvim-lspconfig",
dependencies = {
"williamboman/mason.nvim",
"williamboman/mason-lspconfig.nvim",
"hrsh7th/nvim-cmp",
},
config = function()
require("mason").setup()
require("mason-lspconfig").setup({
ensure_installed = { "pyright", "lua_ls", "ts_ls", "rust_analyzer" }
})
vim.api.nvim_create_autocmd("LspAttach", {
group = vim.api.nvim_create_augroup("UserLspConfig", {}),
callback = function(ev)
local opts = { buffer = ev.buf }
vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts)
vim.keymap.set({ "n", "v" }, "<leader>ca", vim.lsp.buf.code_action, opts)
vim.keymap.set("n", "gr", vim.lsp.buf.references, opts)
end,
})
local lspconfig = require("lspconfig")
require("mason-lspconfig").setup_handlers({
function(server_name)
lspconfig[server_name].setup({})
end,
})
end,
}