swipl窗口中的SWI-Prolog流I / O和选项卡完成

时间:2013-06-28 21:02:38

标签: io swi-prolog tab-completion

我在做什么

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

如果你想查看我的代码,那就是here ...请记住,我不是一个Prolog大师(友情提示非常受欢迎)


我在想什么

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

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


我在问什么

您认为我应该如何处理此问题(字符串或流)?商店到字符串方法和制作新流方式听起来都像是他们各自都有自己的优势所以我很确定解决方案将是两者的某种组合。 有关实现目标的任何想法,更正或建议吗?(双关语)

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

1 个答案:

答案 0 :(得分:0)

在不更改swipl-win.exe控制台底层的C代码的情况下完成此操作将很难。这也涉及从here开始的邮件列表上的线程。完成调用者在src / pl-ntmain.c中,do_complete() 对于Windows和src / os / pl-rl.c,prolog_completion()用于在Unix系统上使用的基于GNU readline的完成。

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