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)

  1. Salve o arquivo como: options_SeuNome.lua
  2. 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,
}