从完成弹出菜单中获取所选项目

时间:2012-12-27 11:11:52

标签: vim

我正在尝试为某些PLSQL函数/过程参数实现智能omni完成。每个这样的函数都可能被重载,所以在一开始,我提供了所有重载版本的所有参数。例如,假设我们有这个:

    procedure test(param1 varchar2, param2 varchar2);  <= overload 1
    procedure test(p1 integer, p2 integer);    <= overload 2
    procedure test(p1 date, p2 date, p3 date); <= overload 3

我输入exec test(|<=cursor here时提供的列表是:

param1 [o1]
param2 [o1]
p1 [o2]
p2 [o2]
p1 [o3]
p2 [o3]
p3 [o3]

如果用户从完成弹出菜单中选择"p1 [o2]",我想记住他的选择,并且对于下一次完成尝试,提供仅使用[o2]参数过滤的列表或以不同方式对其进行排序,以便首先显示[o2]项目。

问题在于我无法弄清楚如何从完成弹出菜单中获取用户已选择和接受的项目。有没有一个干净的方法来实现它?有一点很有趣的是我记住了整个用户案例,但是在我开始之前就陷入了困境。在不知道用户从列表中选择了什么的情况下,很难实现这种“自学习/自适应”代码完成系统。

2 个答案:

答案 0 :(得分:3)

从Vim 8.0和neovim 0.1.5开始(至少,我不确定何时添加了这个)现在有一个包含匹配对象的v:completed_item变量(参见{{ 1}}帮助页面)与上次完成相关联(特别是最后一次complete-items事件)。如果完成失败或离开并重新进入插入模式,则此变量包含空字典。

但是,为了使用它来确定是否明确选择了完成项,您必须设置CompleteDone。否则,completeopt+=noinsert将始终设置为完成菜单中的第一个项目,即使您尚未明确选择它。

答案 1 :(得分:1)

最近的Vim补丁7.3.598引入了CompleteDone事件,但您也可以使用CursorMovedI事件,该事件在插入完成候选项后触发。

光标(matchstr(strpart(getline('.'), 0, col('.') - 1), '\k\+$'))之前的关键字是插入的完成;将其保存在变量中,并在下次完成时考虑这一点。 (您可能还需要保存光标位置(通过getpos()),以避免考虑何时在另一个地方发生全新的,无关的完成。