2

我在做什么

我目前正在创建一个 SWI-Prolog 模块,该模块将制表符完成功能添加到 swipl-win 窗口。到目前为止,我实际上已经将它带到了一次读取单个字符的位置,而无需停止/返回任何内容,直到键入制表符为止。我还编写了一个谓词,它通过对当前术语列表使用子字符串匹配(通过current_functor/2current_arithmetic_function/1current_predicate/2等获得[所使用的谓词最终将基于上下文])来返回不完整类型术语的所有可能完成。

如果您想查看我的代码,它就在这里……请记住,我还不是 Prolog 大师(非常欢迎友好的提示)。


我在想什么

我意识到,当我实际实现我的主要完成谓词(仍未写入)时,我必须弄清楚输入流中的最后一个“单词”是什么。我正在争论是否应该使用输入流中的所有内容创建一个新流(所以我不必更改输入流中的位置/回到开头)还是写入字符串......如果我采用第二种方法,我将在输入分隔字符时重新开始字符串(以新“单词”开头的字符,如空格、逗号、括号、运算符等),因此不会有任何每次按下选项卡时都在流中搜索。

但是,还有另一件事:当用户浏览和修改已键入但尚未提交的查询(通过箭头键和退格等)时,需要一个单独的流来处理中间流完成。如果在流的末尾请求完成,则字符串会很好(处理退格就像删除字符串的最后一个字符一样简单),但由于字符串只包含当前的“单词”,tabber.pl 会在这样的情况下不知所措。当然,除非当前单词字符串会更新并在用户在中途导航和键入时找到光标所在的当前单词......(我可以使用at_end_of_stream(Stream)它吗?)


我在问什么

你认为我应该如何处理这个(字符串或流)?store-to-string 方法和 make-a-new-stream 方法听起来都各有优势,所以我很确定解决方案将是两者的某种组合。对实现我的目标有任何想法、更正或建议吗?(双关语)

为了弄清楚这一点并真正正确地做到这一点,我想我还必须知道 SWI-Prolog 如何使用 swipl-win 窗口中的输入和输出流。(它显然是在接受输入,但是当你输入[输入流]时它是否使用输出流来写入窗口?)

4

1 回答 1

0

在不更改 swipl-win.exe 控制台底层的 C 代码的情况下完成这项工作将很困难。这也与从这里开始的邮件列表中的一个线程有关。完成调用程序在 src/pl-ntmain.c,do_complete() 用于 Windows 和 src/os/pl-rl.c,prolog_completion() 用于 Unix 系统上使用的基于 GNU readline 的完成。

第一步是使用回调将这两个以及引用线程中描述的即将到来的一个引导回 Prolog。这需要对完成接口的设计进行少量研究,以得出合适的 Prolog 回调。我想这应该传递整行和插入符号位置的一些表示,并从插入符号返回完成列表。这样,任何人都可以编写自己的智能完成器。

于 2013-07-01T14:39:26.287 回答