2

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

    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] 项目.

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

4

2 回答 2

3

从 Vim 8.0 和 neovim 0.1.5 开始(至少,我不确定它是什么时候添加的),现在有一个v:completed_item变量包含complete-items与最后一个完成相关的匹配对象(参见帮助页面)(具体来说,最后一个CompleteDone事件)。如果完成失败或您离开并重新进入插入模式,则此变量包含一个空字典。

但是,为了使用它来确定是否显式选择了完成项,您必须设置completeopt+=noinsert. 否则v:completed_item在完成菜单打开后将始终设置为第一项,即使您没有明确选择它。

于 2016-09-30T20:06:52.720 回答
1

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

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

于 2012-12-27T11:26:23.590 回答