folke / lazy.nvim

💤 A modern plugin manager for Neovim
https://lazy.folke.io/
Apache License 2.0
14.08k stars 337 forks source link

bug: [Question] Migrating from packer, attempt to call field get_snippets (a nil value) #142

Closed surmish closed 1 year ago

surmish commented 1 year ago

Did you check docs and existing issues?

Neovim version (nvim -v)

nightly

Operating system/version

ubuntu

Describe the bug

I have a minimal lazy setup for testing (with only completion and nvim-lspconfig plugins). I see the following error sometimes when open an empty file abc.cpp

Error detected while processing TextChangedI Autocommands for "*":                                                                                              
Error executing lua callback: ...cal/share/nvim/lazy/cmp_luasnip/lua/cmp_luasnip/init.lua:75: attempt to call field 'get_snippets' (a nil value)                
stack traceback:                                                                                                                                                
        ...cal/share/nvim/lazy/cmp_luasnip/lua/cmp_luasnip/init.lua:75: in function 'complete'                                                                  
        ...buntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/source.lua:325: in function 'complete'                                                                 
        .../ubuntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/core.lua:289: in function 'complete'                                                                 
        .../ubuntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/core.lua:169: in function 'callback'                                                                 
        .../ubuntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/core.lua:219: in function 'autoindent'                                                               
        .../ubuntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/core.lua:161: in function 'on_change'                                                                
        .../ubuntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/init.lua:312: in function 'callback'                                                                 
        ...local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/autocmd.lua:49: in function 'emit'                                                                      
        ...local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/autocmd.lua:23: in function <...local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/autocmd.lua:22>            
Error detected while processing TextChangedI Autocommands for "*":                                                                                              
Error executing lua callback: ...cal/share/nvim/lazy/cmp_luasnip/lua/cmp_luasnip/init.lua:75: attempt to call field 'get_snippets' (a nil value)                
stack traceback:                                                                                                                                                
        ...cal/share/nvim/lazy/cmp_luasnip/lua/cmp_luasnip/init.lua:75: in function 'complete'                                                                  
        ...buntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/source.lua:325: in function 'complete'                                                                 
        .../ubuntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/core.lua:289: in function 'complete'                                                                 
        .../ubuntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/core.lua:169: in function 'callback'                                                                 
        .../ubuntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/core.lua:219: in function 'autoindent'                                                               
        .../ubuntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/core.lua:161: in function 'on_change'                                                                
        .../ubuntu/.local/share/nvim/lazy/nvim-cmp/lua/cmp/init.lua:312: in function 'callback'                                                                 
        ...local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/autocmd.lua:49: in function 'emit'                                                                      
        ...local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/autocmd.lua:23: in function <...local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/autocmd.lua:22>            
Failed to run `config` for LuaSnip                                                                                                                              
/home/ubuntu/.config/nvim/lua/config/plugins/luasnip.lua:19: attempt to index field 'config' (a function value)                                                 
# stacktrace:                                                                                                                                                   
  - luasnip.lua:19                                                                                                                                              
  - /cmp_luasnip/lua/cmp_luasnip/init.lua:67 _in_ **complete**                                                                                                  
Error detected while processing InsertLeave Autocommands for "*":                                                                                               
E5108: Error executing lua [string ":lua"]:1: attempt to call field 'active_update_dependents' (a nil value)                                                    
stack traceback:                                                                                                                                                
        [string ":lua"]:1: in main chunk 

image

Steps To Reproduce

Here is the directory structure:

.config/nvim/lua 
[I] ➜ tree
.
└── config
    ├── commands.lua
    ├── lazy.lua
    ├── plugins
    │   ├── cmp.lua
    │   ├── lspconfig.lua
    │   └── luasnip.lua
    └── plugins.lua

2 directories, 6 files

lspconfig.lua

local M = {
  "neovim/nvim-lspconfig",
  event = "InsertEnter",
  dependencies = {
    "j-hui/fidget.nvim",
    "hrsh7th/cmp-nvim-lsp",
    "hrsh7th/nvim-cmp",
  },
}

function M.config()

  -- nvim-cmp supports additional completion capabilities
  local capabilities = vim.lsp.protocol.make_client_capabilities()
  capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)

  local lspconfig = require("lspconfig")
  lspconfig.racket_langserver.setup{}

  lspconfig.pyright.setup{
    capabilities = capabilities
  }

  lspconfig.clangd.setup {
    default_config = { 
      capabilities = capabilities; 
      cmd = { "clangd", "--background-index","--all-scopes-completion", "--pch-storage=memory", "--clang-tidy", "--suggest-missing-includes", "--cross-file-rename" }, 
      filetypes = {"c", "cpp"}, 
      init_options = { 
        clangdFileStatus     = true,
        usePlaceholders      = true,
        completeUnimported   = true,
        semanticHighlighting = false
      }, 
      root_dir = require'lspconfig'.util.root_pattern("compile_flags.txt") 
      -- root_dir = require'lspconfig'.util.root_pattern("compile_flags.txt","apbld","compile_commands.json") 
    }, 
    on_attach = on_attach_common 
  }

  lspconfig.rust_analyzer.setup({
    on_attach=on_attach,
    capabilities = capabilities,
    settings = {
      ["rust-analyzer"] = {
        assist = {
          importGranularity = "module",
          importPrefix = "by_self",
        },
        cargo = {
          loadOutDirsFromCheck = true
        },
        procMacro = {
          enable = true
        },
      }
    }
  })

end

return M

cmp.lua

local M = {
  "hrsh7th/nvim-cmp",
  event = "InsertEnter",
  dependencies = {
    "hrsh7th/cmp-nvim-lsp",
    "hrsh7th/cmp-buffer",
    "hrsh7th/cmp-emoji",
    "hrsh7th/cmp-cmdline",
    "hrsh7th/cmp-path",
    "saadparwaiz1/cmp_luasnip",
    "dmitmel/cmp-cmdline-history",
    "lukas-reineke/cmp-under-comparator",
    "hrsh7th/cmp-nvim-lsp-signature-help",
  },
}

function M.config()
  vim.o.completeopt = "menuone,noselect"

  -- nvim-cmp setup
  local cmp = require'cmp'
  local types = require'cmp.types'
  local luasnip = require'luasnip'

  cmp.setup {
    snippet = {
      expand = function(args)
        luasnip.lsp_expand(args.body)
      end,
    },
    mapping = cmp.mapping.preset.insert {
      ['<C-d>'] = cmp.mapping.scroll_docs(-4),
      ['<C-f>'] = cmp.mapping.scroll_docs(4),
      ['<C-Space>'] = cmp.mapping.complete(),
      ['<CR>'] = cmp.mapping.confirm {
        behavior = cmp.ConfirmBehavior.Replace,
        select = true,
      },
      ['<Tab>'] = cmp.mapping(function(fallback)
        if cmp.visible() then
          cmp.select_next_item()
        elseif luasnip.expand_or_jumpable() then
          luasnip.expand_or_jump()
        else
          fallback()
        end
      end, { 'i', 'c', 's' }),
      ['<S-Tab>'] = cmp.mapping(function(fallback)
        if cmp.visible() then
          cmp.select_prev_item()
        elseif luasnip.jumpable(-1) then
          luasnip.jump(-1)
        else
          fallback()
        end
      end, { 'i', 'c', 's' }),
    },
    sorting = {
      comparators = {
        cmp.config.compare.offset,
        cmp.config.compare.exact,
        cmp.config.compare.score,
        require("cmp-under-comparator").under,
        -- Same as cmp.config.compare.kind, but with the addition of preferring Variables over Text.
        function(entry1, entry2)
          local kind1 = entry1:get_kind()
          kind1 = kind1 == types.lsp.CompletionItemKind.Text and 100 or kind1
          kind1 = kind1 == types.lsp.CompletionItemKind.Variable and 1 or kind1
          local kind2 = entry2:get_kind()
          kind2 = kind2 == types.lsp.CompletionItemKind.Text and 100 or kind2
          kind2 = kind2 == types.lsp.CompletionItemKind.Variable and 1 or kind2
          if kind1 ~= kind2 then
            if kind1 == types.lsp.CompletionItemKind.Snippet then
              return true
            end
            if kind2 == types.lsp.CompletionItemKind.Snippet then
              return false
            end
            local diff = kind1 - kind2
            if diff < 0 then
              return true
            elseif diff > 0 then
              return false
            end
          end
        end,
        cmp.config.compare.sort_text,
        cmp.config.compare.length,
        cmp.config.compare.order,
      },
      priority_weight = 100,
    },
    sources = cmp.config.sources({
      { name = "path", priority_weight = 105 },
      { name = "cmdline", priority_weight = 105 },
      { name = "luasnip", max_item_count = 8, priority_weight = 103 },
      { name = "nvim_lsp", max_item_count = 5, priority_weight = 100 },
      { name = "nvim_lsp_signature_help", max_item_count = 5, priority_weight = 99 },
      { name = "buffer", max_item_count = 5, priority_weight = 70 },
    }),
  }
  -- Use buffer source for `/` (if you enabled `native_menu`, this won't work anymore).
  cmp.setup.cmdline('/', {
    sources = {
      { name = 'buffer' }
    }
  })
  -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore).
  -- `:` cmdline setup.
  cmp.setup.cmdline( ':', {
    mapping = cmp.mapping.preset.cmdline(),
    sources = cmp.config.sources(
      {
        { name = 'path' }
      },
      {
        {
          name = 'cmdline',
          option = {
            ignore_cmds = { 'Man', '!' }
          }
        }
      })
  })

end

return M

Expected Behavior

NO error, and autocomplete suggestions in drop down are expected.

Repro

require("config.lazy")

vim.api.nvim_create_autocmd("User", {
  pattern = "VeryLazy",
  callback = function()
    require("config.commands")
  end,
})
surmish commented 1 year ago

Also, sometimes no error shows up, but the autocomplete dropdown doesn't appear still. What am I doing wrong?

surmish commented 1 year ago

Nevermind, I installed null-ls and that was able to trigger autocompletions.