在播放和扩展stdiodemo.py时,
一个想出了添加命令行历史记录的想法。
这可能吗?
有什么提示吗?
谢谢
安东尼·K。
最佳答案
当然有可能。历史可以在某种程度上与输入无关地进行处理,因此理想情况下,您可以使用addLine
和previousLine
等方法使一个对象代表您的历史。然后,将其粘贴到您选择的用户界面上,无论是Gtk应用程序中的输入框,还是stdio上的东西。
作为(未完成的)IRC客户端的一部分,我编写了这样的内容:https://github.com/exarkun/invective/blob/master/invective/history.py
实际上,在同一个项目中,您会找到LineInputWidget,将其连接到stdio,并且还实现了emacs风格的kill和yank,前向和后向单词等功能。
但是,stdiodemo.py无法处理诸如向上箭头和向下箭头之类的操作,您可能需要这些来进行明智的历史导航。相反,您需要使用一些知道如何解释终端控制序列的代码以原始模式处理stdio。如果您曾经运行过“ cat”并按下箭头或任何其他功能键,那么您会知道每个字节都有一个特殊的字节序列。程序中的某些内容需要解释这些序列,并将它们转变为明智的方法。这就是twisted.conch.insults.insults.ServerProtocol
的作用。它将与终端连接的字节传输方式转变为另一种更丰富的传输方式:一种传输方式可以告诉您何时字节到达,以及何时按下各种特殊键。您可以通过运行以下命令查看使用输入历史记录运行基于行的协议的示例:
python -m twisted.conch.stdio
这使用
ServerProtocol
和Twisted本身的输入历史记录类之一运行Python REPL(此REPL的特殊之处在于,它使反应堆与输入同时运行,这在常规Python REPL中是一项挑战) 。您可以在twisted / conch / stdio.py中找到其来源。重要的stdio联播代码在
runWithProtocol
类中。了解它如何实例化ServerProtocol
并将其与StandardIO
连接到stdio(因此,它只是在stdiodemo.py的基础上构建而成)。但是,ServerProtocol
仅解释来自终端的字节。它没有您的应用程序逻辑。因此,您需要给它一个实现您的应用程序逻辑的类。那就是exactly what invective does。关于python - 标准和命令历史,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3246841/