2010-07-14 166 views
1

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

感谢 安东尼斯·K.

+0

你问'readline'吗? http://docs.python.org/library/readline.html – 2010-07-14 14:05:24

+0

不,这个'twisted'标签意味着他在询问Twisted异步标准io演示。 http://twistedmatrix.com/trac/browser/trunk/doc/core/examples/stdiodemo.py – Glyph 2010-07-16 03:09:18

+0

感谢雕文的澄清! – Antonis 2010-07-16 09:44:07

回答

1

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

作为(未完)IRC客户端的一部分,我已经写了这样的事情:https://github.com/exarkun/invective/blob/master/invective/history.py

而实际上,在同一项目中,你会发现LineInputWidget鱼钩这件事到标准输入输出,并且还器具诸如emacs风格的杀戮和猛击,正向和反向字等。

stdiodemo.py无法处理像向上箭头和向下箭头这样的事情,尽管如此,您可能需要进行明智的历史导航。相反,您需要使用一些知道如何解释终端控制序列的代码,在原始模式下处理stdio。如果你曾经运行过“cat”并点击箭头或任何其他功能键,那么你知道每个字节都有一个特殊的字节序列。程序中的某些东西需要解释这些序列并将它们转化为合理的东西。这是twisted.conch.insults.insults.ServerProtocol所做的。它将连接到终端的字节传输转变为另一种更丰富的传输方式:一种可以告诉你字节何时到达的传输方式,以及当按下各种特殊键时。您可以通过运行查看正在运行的输入历史基于行的协议的一个例子:

python -m twisted.conch.stdio 

此使用ServerProtocol和扭曲自己的输入历史课的一个(关于这个REPL的特别之处是运行一个Python REPL它具有与处理输入同时运行的reactor,这在正常的Python REPL中是一项挑战)。

你可以在twisted/conch/stdio.py中找到它的来源。重要的stdio连接代码位于runWithProtocol类中。看看它是如何实例化一个ServerProtocol并将其连接到stdio与StandardIO(所以它只是建立更多的stdiodemo.py的顶部)。尽管如此,ServerProtocol只解释来自终端的字节。它没有你的应用程序逻辑。所以你需要给它一个实现你的应用程序逻辑的类。那是exactly what invective does

+0

非常感谢你! Antonis K. – Antonis 2010-07-14 22:52:42

+0

好吧,看来我无法将History对象与stdiodemo.py的方法粘合起来,这样我就可以获得我输入的命令的历史记录。 请提供更多提示吗? – Antonis 2010-07-15 12:09:55

+0

我扩大了答案,希望有所帮助。 :) – 2010-07-15 13:52:42