stdiodemo和命令历史

时间:2010-07-14 13:58:40

标签: python twisted

在播放和扩展stdiodemo.py时, 想出了添加命令行历史记录的想法。 这可能吗? 任何提示?

由于 Antonis K。

1 个答案:

答案 0 :(得分:1)

这当然是可能的。历史记录可以在某种程度上独立于输入处理,因此理想情况下,您可以使用addLinepreviousLine等方法来表示历史记录。然后你将它粘贴到你选择的用户界面,无论是Gtk应用程序中的输入框还是stdio上的某个东西。

作为(未完成的)IRC客户的一部分,我写过这样的文章:https://github.com/exarkun/invective/blob/master/invective/history.py

实际上,在同一个项目中,你会发现LineInputWidget将它与stdio挂钩,并且还实现了emacs-style kill和yank,forward-andward-word等等。

但是,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