Motor de Completion

    Definição curta: Tutorial para configurar o nvim-cmp como motor de autocompletion no Neovim, integrando LSP, buffers, snippets e mais.

    Antes de começar

    • Neovim v0.11 ou mais recente instalado — confira com nvim --version
    • Um init.lua que já carrega, ainda que vazio

    O que você vai aprender

    • Explicar Plugins necessários com suas palavras
    • Explicar Configuração básica com suas palavras
    • Explicar Fontes de completion com suas palavras
    • Localizar o assunto desta página no :help do seu próprio Neovim

    O que é

    O nvim-cmp é o motor de completion mais popular para Neovim. Fornece autocompletion inteligente integrando múltiplas fontes.

    Índice de sub-tópicos

    Plugins necessários

    -- plugins/cmp.lua
    return {
      "hrsh7th/nvim-cmp",
      dependencies = {
        "hrsh7th/cmp-nvim-lsp",      -- LSP source
        "hrsh7th/cmp-buffer",        -- Buffer source
        "hrsh7th/cmp-path",          -- Path source
        "hrsh7th/cmp-cmdline",       -- Cmdline source
        "L3MON4D3/LuaSnip",          -- Snippets
        "saadparwaiz1/cmp_luasnip",  -- Snippets source
      },
    }

    Configuração básica

    -- setup/cmp.lua
    local cmp = require("cmp")
    
    cmp.setup({
      snippet = {
        expand = function(args)
          require("luasnip").lsp_expand(args.body)
        end,
      },
      mapping = cmp.mapping.preset.insert({
        ["<C-b>"] = cmp.mapping.scroll_docs(-4),
        ["<C-f>"] = cmp.mapping.scroll_docs(4),
        ["<C-Space>"] = cmp.mapping.complete(),
        ["<C-e>"] = cmp.mapping.abort(),
        ["<CR>"] = cmp.mapping.confirm({ select = true }),
      }),
      sources = cmp.config.sources({
        { name = "nvim_lsp" },
        { name = "luasnip" },
        { name = "buffer" },
        { name = "path" },
      }),
    })

    Fontes de completion

    FonteDescrição
    nvim_lspCompletions do LSP
    luasnipSnippets
    bufferPalavras do buffer
    pathCaminhos de arquivo
    cmdlineComandos

    Snippets

    -- Snippet Lua
    local luasnip = require("luasnip")
    luasnip.add_snippets("lua", {
      luasnip.snippet("req", {
        luasnip.text_node("local "),
        luasnip.function_node(1, 1, { "require" }),
        luasnip.text_node('(""),
        luasnip.insert_node(1),
        luasnip.text_node('")'),
      }),
    })

    Keymaps

    cmp.setup({
      mapping = cmp.mapping.preset.insert({
        ["<Tab>"] = cmp.mapping(function(fallback)
          if cmp.visible() then
            cmp.select_next_item()
          else
            fallback()
          end
        end, { "i", "s" }),
      }),
    })

    Você aprendeu

    • Plugins necessários
    • Configuração básica
    • Fontes de completion
    • Snippets
    • Keymaps

    Perguntas para reflexão

    1. O que Plugins necessários resolve, e o que se perde sem isso?
    2. O que Configuração básica resolve, e o que se perde sem isso?
    3. O que Fontes de completion 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