Io SWI Prolog流I/O和swipl窗口中的制表符完成 我在做什么

Io SWI Prolog流I/O和swipl窗口中的制表符完成 我在做什么,io,swi-prolog,tab-completion,Io,Swi Prolog,Tab Completion,我目前正在创建一个SWI Prolog模块,该模块将选项卡完成功能添加到swipl win窗口中。到目前为止,我已经让它一次只读取一个字符,在键入制表符之前不停止/返回任何内容。我还编写了一个谓词,通过在当前术语列表上使用子字符串匹配(通过current\u functor/2,current\u算术函数/1,current\u predicate/2等获得),返回不完全类型术语的所有可能完成形式[使用的谓词最终将基于上下文]) 如果您想查看我的代码,它是…请记住,我还不是一名真正的Prolog

我目前正在创建一个SWI Prolog模块,该模块将选项卡完成功能添加到swipl win窗口中。到目前为止,我已经让它一次只读取一个字符,在键入制表符之前不停止/返回任何内容。我还编写了一个谓词,通过在当前术语列表上使用子字符串匹配(通过
current\u functor/2
current\u算术函数/1
current\u predicate/2
等获得),返回不完全类型术语的所有可能完成形式[使用的谓词最终将基于上下文])

如果您想查看我的代码,它是…请记住,我还不是一名真正的Prolog大师(欢迎提供友好提示)


我在想什么 我意识到,当我实际实现我的主完成谓词(尚未编写)时,我必须弄清楚输入流中的最后一个“单词”是什么。我正在讨论是否应该创建一个新的流,其中包含到目前为止输入流中的所有内容。(因此,我不必更改输入流中的位置/回到开头)或写入字符串。如果采用第二种方法,每当输入定界字符(开始新“单词”的字符,如空格、逗号、括号、运算符等)时,我将重新开始字符串因此,每次按下tab键时,不会在流中进行任何搜索

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


我在问什么 你认为我应该如何处理这个问题(字符串或流)?存储到字符串方法和创建新的流方式听起来都有各自的优点,因此我非常确定解决方案将是两者的某种组合。关于实现我的目标有什么想法、更正或建议吗?(双关语)


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

在不更改swipl-win.exe控制台底层的C代码的情况下完成此操作将非常困难。这还与邮件列表上启动的线程有关。完成调用程序位于src/pl ntmain.C,do_complete() 对于Windows和src/os/pl rl.c,prolog_completion()用于Unix系统上使用的基于GNU readline的完成

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

Wow谢谢s先生Wielemaker!(我很荣幸有这么一位知名且备受尊敬的人物回答了我的一个问题。)我有没有办法利用它来编写一些可以加载/添加到SWI Prolog(最好是在它运行时)的东西,而不必编译我自己的单独版本的SWI Prolog?(否则,我也可以编写自己的控制台窗口,它只是用户Prolog安装的一个界面。)