init.lua Fullstack

    Definição curta: Exemplo completo de init.lua com plugin manager (lazy.nvim), LSP, Treesitter, Telescope, nvim-cmp e configurações avançadas.

    Antes de começar

    O que você vai aprender

    • Explicar Estrutura de arquivos com suas palavras
    • Explicar init.lua (principal) com suas palavras
    • Explicar lua/user/plugins.lua com suas palavras
    • Localizar o assunto desta página no :help do seu próprio Neovim

    O que é

    Este é um setup completo e funcional com todos os principais plugins e configurações. Estruturado em módulos separados.

    Estrutura de arquivos

    ~/.config/nvim/
    ├── init.lua
    ├── lua/
    │   └── user/
    │       ├── options.lua
    │       ├── keymaps.lua
    │       ├── plugins.lua
    │       └── lsp/
    │           ├── init.lua
    │           ├── servers.lua
    │           └── formatting.lua

    init.lua (principal)

    -- ~/.config/nvim/init.lua
    
    -- Bootstrap 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)
    
    -- Plugins
    require("user.plugins")
    
    -- Config
    require("user.options")
    require("user.keymaps")
    require("user.lsp")

    lua/user/plugins.lua

    -- ~/.config/nvim/lua/user/plugins.lua
    return {
      -- Lazy
      { "folke/lazy.nvim" },
    
      -- LSP
      { "neovim/nvim-lspconfig" },
      { "mason-org/mason.nvim" },
      { "mason-org/mason-lspconfig.nvim" },
    
      -- Treesitter
      { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate" },
      { "nvim-treesitter/nvim-treesitter-textobjects" },
    
      -- Completion
      { "hrsh7th/nvim-cmp" },
      { "hrsh7th/cmp-nvim-lsp" },
      { "hrsh7th/cmp-buffer" },
      { "hrsh7th/cmp-path" },
      { "L3MON4D3/LuaSnip" },
      { "saadparwaiz1/cmp_luasnip" },
    
      -- Telescope
      { "nvim-telescope/telescope.nvim", dependencies = { "nvim-lua/plenary.nvim" } },
    
      -- UI
      { "catppuccin/nvim", name = "catppuccin" },
    }

    lua/user/options.lua

    -- ~/.config/nvim/lua/user/options.lua
    vim.opt.number = true
    vim.opt.relativenumber = true
    vim.opt.cursorline = true
    vim.opt.signcolumn = "yes"
    vim.opt.expandtab = true
    vim.opt.tabstop = 2
    vim.opt.shiftwidth = 2
    vim.opt.smartindent = true
    vim.opt.wrap = false
    vim.opt.hidden = true
    vim.opt.termguicolors = true
    vim.g.mapleader = " "

    lua/user/keymaps.lua

    -- ~/.config/nvim/lua/user/keymaps.lua
    vim.keymap.set("n", "<leader>w", ":w<CR>", { silent = true })
    vim.keymap.set("n", "<leader>q", ":q<CR>", { silent = true })
    vim.keymap.set("n", "<Esc>", ":noh<CR>", { silent = true })
    vim.keymap.set("n", "j", "v:count || mode(1)[0] == 'no' and 'j' or 'gj'", { expr = true })
    vim.keymap.set("n", "k", "v:count || mode(1)[0] == 'no' and 'k' or 'gk'", { expr = true })

    Diagrama de fluxo de carregamento

    flowchart LR
        A["init.lua"] --> B["plugins.lua\nlazy.nvim"]
        A --> C["options.lua"]
        A --> D["keymaps.lua"]
        A --> E["lsp/init.lua"]
        B --> F["LSP Config"]
        B --> G["Treesitter"]
        B --> H["Telescope"]
        B --> I["cmp"]

    Você aprendeu

    • Estrutura de arquivos
    • init.lua (principal)
    • lua/user/plugins.lua
    • lua/user/options.lua
    • lua/user/keymaps.lua

    Perguntas para reflexão

    1. O que Estrutura de arquivos resolve, e o que se perde sem isso?
    2. O que init.lua (principal) resolve, e o que se perde sem isso?
    3. O que lua/user/plugins.lua resolve, e o que se perde sem isso?
    4. Qual parte desta página você conseguiria reproduzir sem consultar, direto no editor?

    Artigos relacionados

    Veja também

    Referências