nvim-cmp.luaattempt to index field ‘menu‘ (a nil value)

2023-05-16

《06_[nvim0.5+从0单排]_Native LSP 自动补全、语法检查、code action、代码段—TypeScript篇》
https://www.bilibili.com/video/BV19T4y1Z7VB/

有朋友使用我的配置,遇到了如下的错。

报错信息

在这里插入图片描述

E5108: Error executing lua /Users/itkey/.config/nvim/after/plugin/nvim-cmp.lua:81: attempt to index field ‘menu’ (a nil value)

问题分析

一开始我也很纳闷,相同的配置怎么我的是正常的呢?

终于发现原因了,由于nvim-cmp插件升级导致。我录制视频之时,这段代码还是可以正常用的。等到大家看视频的时候。nvim-cmp插件升级了,我的这段配置不兼容了。[笑哭] 临时解决办法就是先删除这段配置。

https://github.com/hrsh7th/nvim-cmp

解决办法

方法一:直接删除报错的代码

很抱歉给你带来困扰。79-104行代码出自我手,用于function对象按回车自动补全(),删了不影响什么。

删除75行至104行,也就是删除如下代码。问题解决!

--重写插件方法,为了实现function 后,自动追加()
local core = require("cmp.core")
local keymap = require("cmp.utils.keymap")
--local cmp_confirm = cmp.confirm
cmp.confirm = function(option)
  option = option or {}
  local e = core.menu:get_selected_entry() or (option.select and core.menu:get_first_entry() or nil)
  if e then
    core.confirm(
      e,
      {
        behavior = option.behavior
      },
      function()
        local myContext = core.get_context({reason = cmp.ContextReason.TriggerOnly})
        core.complete(myContext)
        --function() 自动增加()
        if
          e and e.resolved_completion_item and
            (e.resolved_completion_item.kind == 3 or e.resolved_completion_item.kind == 2)
         then
          vim.api.nvim_feedkeys(keymap.t("()<Left>"), "n", true)
        end
      end
    )
    return true
  else
    return false
  end
end

方法二:升级代码

如果你觉得自动补全()有用的话,把75行至104行代码换成如下代码:

------修复2021年10月12日 nvim-cmp.luaattempt to index field 'menu' (a nil value)---------
--重写插件方法,为了实现function 后,自动追加()
local keymap = require("cmp.utils.keymap")
cmp.confirm = function(option)
  option = option or {}
  local e = cmp.core.view:get_selected_entry() or (option.select and cmp.core.view:get_first_entry() or nil)
  if e then
    cmp.core:confirm(e, {
      behavior = option.behavior,
    }, function()
        local myContext = cmp.core:get_context({ reason = cmp.ContextReason.TriggerOnly })
        cmp.core:complete(myContext)
                --function() 自动增加()
                if
                  e and e.resolved_completion_item and
                    (e.resolved_completion_item.kind == 3 or e.resolved_completion_item.kind == 2)
                 then
                  vim.api.nvim_feedkeys(keymap.t("()<Left>"), "n", true)
                end
    end)
    return true
  else
    if vim.fn.complete_info({ 'selected' }).selected ~= -1 then
      keymap.feedkeys(keymap.t('<C-y>'), 'n')
      return true
    end
    return false
  end
end
---------------

新版nvim-cmp升级后导致补全时按tab无效的解决办法

这个我挺难受的,升级个插件,原来的配置竟然不能用了。然后我看了一下nvim-cmp.lua项目的主页说明。貌似配置被减化了。

把原来的这一堆代码,

["<Tab>"] = function(fallback)
      if vim.fn.pumvisible() == 1 then
        vim.fn.feedkeys(vim.api.nvim_replace_termcodes("<C-n>", true, true, true), "n")
      elseif luasnip.expand_or_jumpable() then
        vim.fn.feedkeys(vim.api.nvim_replace_termcodes("<Plug>luasnip-expand-or-jump", true, true, true), "")
      else
        fallback()
      end
    end

现在换成

['<Tab>'] = function(fallback)
      if cmp.visible() then
        cmp.select_next_item()
      elseif luasnip.expand_or_jumpable() then
        vim.fn.feedkeys(vim.api.nvim_replace_termcodes('<Plug>luasnip-expand-or-jump', true, true, true), '')
      else
        fallback()
      end
    end,

原来很多行解决的问题,现在一行就搞定了。

同理

["<S-Tab>"] = function(fallback)
      if vim.fn.pumvisible() == 1 then
        vim.fn.feedkeys(vim.api.nvim_replace_termcodes("<C-p>", true, true, true), "n")
      elseif luasnip.jumpable(-1) then
        vim.fn.feedkeys(vim.api.nvim_replace_termcodes("<Plug>luasnip-jump-prev", true, true, true), "")
      else
        fallback()
      end
    end

替换成

['<S-Tab>'] = function(fallback)
      if cmp.visible() then
        cmp.select_prev_item()
      elseif luasnip.jumpable(-1) then
        vim.fn.feedkeys(vim.api.nvim_replace_termcodes('<Plug>luasnip-jump-prev', true, true, true), '')
      else
        fallback()
      end
    end,

参考

https://github.com/neovim/nvim-lspconfig/wiki/Snippets

https://github.com/L3MON4D3/LuaSnip

https://github.com/hrsh7th/nvim-cmp

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nvim-cmp.luaattempt to index field ‘menu‘ (a nil value) 的相关文章

  • 枚举构造函数(创建成员的成员)

    在 D 中 我试图创建一个成员有成员的枚举 我可以通过一个例子更好地解释我想要做什么 其中s and i代表我试图创建的子成员 在Python中 我可以这样做 class Foo enum Enum A A string 0 B B str
  • 为什么Java中方法调用中间要使用括号?

    尽管我做了一些广泛的搜索 但我遇到了一些代码 但无法理解它的某些方面 我的问题是 为什么在方法调用中间使用括号 package com zetcode import java awt event ActionEvent import jav
  • 可从同一类的另一个实例访问私有字段[重复]

    这个问题在这里已经有答案了 我没有得到以下信息 我一直认为我只能从声明该字段的类访问私有字段 但是在这种情况下我可以访问它 class Session List
  • Wordpress 中的联系表格 7 - 如何隐藏电子邮件中未填写的字段?

    谁能帮我找到一种方法来隐藏发送的电子邮件中的字段 基本上我有多行 如多订单列表 如果用户只填写顶行 我不希望其他空行在电子邮件中显示 这是表单的一段代码 但还有其他 8 行 即 10 个订单 tr class stationary orde
  • 帮助匹配两个类之间的字段

    我对 Java 还不太有经验 我希望有人能引导我走向正确的方向 因为现在我感觉我只是在用头撞墙 第一个类称为 MeasuredParams 它有 40 多个数字字段 身高 体重 腰围尺寸 手腕尺寸 一些是整数 但大部分是双精度型 第二类是统
  • Javascript - 从对象中删除未定义的字段[重复]

    这个问题在这里已经有答案了 有没有一种干净的方法可以从对象中删除未定义的字段 i e gt var obj a 1 b undefined c 3 gt removeUndefined obj a 1 c 3 我遇到了两种解决方案 each
  • 在 MATLAB 中组合两个结构体的有效方法有哪些?

    我想组合两个具有不同字段名称的结构 例如 从以下内容开始 A field1 1 A field2 a B field3 2 B field4 b 我想拥有 C field1 1 C field2 a C field3 2 C field4
  • 使用 awk 将大型复杂的一列文件拆分为多列

    我有一个由某些商业软件生成的文本文件 如下所示 它由括号分隔的部分组成 每个部分都有数百万个元素 但具体值因情况而异 1 2 3 11 22 33 111 222 333 我需要实现如下输出 1 11 111 2 22 222 3 33 3
  • java 字段变化监听器

    所以我真的想要某种方法来检测某个对象的场变化 我用谷歌搜索了很长一段时间但没有找到任何东西 所以基本上我需要知道的是对象的某些变量何时发生变化 让我们以这个类为例 public class Example String text test
  • 使用公共字段的最佳实践是什么?

    当我编写类时 我总是通过公共属性公开私有字段 如下所示 private int MyField public int MyField get return MyField 什么时候可以像这样公开一个公共字段 public int MyFie
  • 为什么要使用字段而不是属性?

    我对 C 还很陌生 我认为属性是一件很棒的事情 事实上 这太棒了 以至于我看不出使用字段有任何真正的优势 即使对于私人领域 属性提供的灵活性和模块化似乎充其量可以让您避免严重的头痛 而最坏的情况则根本没有任何效果 我看到的字段的唯一优点是您
  • 将代码添加到 C# 属性获取/设置而不需要支持字段?

    您知道如何拥有自动生成支持字段的属性吗 就像我去的话 public String SomeProperty get set 我知道 如果我想向该属性添加代码 我必须创建支持字段 如下所示 public string someProperty
  • 如何动态访问 Django 模型字段详细名称?

    我想访问我的模型字段 verbose name 我可以通过这样的字段索引来获取它 model meta fields 2 verbose name 但我需要动态获取它 理想情况下应该是这样的 model meta fields locati
  • 如何使用 jQuery 清空输入字段

    我在移动应用程序中 使用输入字段来命令用户提交号码 当我返回并返回到输入字段显示输入字段中显示的最新数字输入的页面时 有没有办法在每次加载页面时清除该字段 shares keyup function payment 0 calcTotal
  • Firebird BLR 是否包含相关字段大小?

    Firebird 和 InterBase 以 BLR 标记化 格式保存存储过程和触发器的编译形式 但我不太了解BLR的结构 字段大小是 BLR 的一部分吗 当存储过程包含两个字段 源和目标 并且稍后我将更改这两个字段的大小时 我会遇到一些问
  • 仅检索 Java 类中声明的静态字段

    我有以下课程 public class Test public static int a 0 public int b 1 是否可以使用反射来仅获取静态字段的列表 我知道我可以获得所有字段的数组Test class getDeclaredF
  • 如何根据另一个字段的值禁止 TFS 要求工作项中的状态从“建议”更改为“活动”?

    I ve added department approvals to the standard CMMI Template Requirement work item I d like to limit the System State f
  • Java 兼容性的公共字段

    我最近对 Kotlin 作为一种语言很感兴趣 因为我们开发的平台是基于 Java 6 的 因此缺乏近年来为 Java 带来的任何语法糖 只有一件事使得在开发中无法使用 Kotlin 而不是 Java 那就是我们开发的平台在内部使用了一些反射
  • 在 Android 编辑文本字段中显示一条消息

    海 我有一个带有一个文本字段的 Android 程序 当它加载到模拟器上时 我需要在该文本字段内显示一条消息 当用户在该文本框中单击时 该消息应该消失 例如 请输入姓名 任何人都可以在这里发布一些示例代码吗 只需使用或致电setHint在物
  • 如何通过模板中的变量访问对象字段?

    我有一个嵌套循环 columns columns range dx dataList range c columns index dx c end end dataList是orm模型数组 和ID Title字段 那么columns is

随机推荐