python - 标准二极管和命令历史记录

标签 python twisted

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

谢谢 安东尼斯·K.

最佳答案

这当然是可能的。历史记录可以在某种程度上独立于输入进行处理,因此理想情况下,您可以使用 addLinepreviousLine 等方法拥有一个代表历史记录的对象。然后,您可以将其粘贴到您选择的用户界面,无论是 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 的作用。它将连接到终端的字节传输转变为一种不同的、更丰富的传输:这种传输可以告诉您字节何时到达,还可以告诉您何时按下各种特殊键。您可以通过运行以下命令查看运行具有输入历史记录的基于行的协议(protocol)的示例:

python -m twisted.conch.stdio

这使用 ServerProtocol 和 Twisted 本身的输入历史记录类之一运行 Python REPL(这个 REPL 的特殊之处在于,它的 react 器在处理输入的同时运行,这是一个挑战在普通的 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/

相关文章:

python - 从 python 上传 blob 到 BlobStore 在 http 上返回 500

python - 按列扩展行,同时根据值操作其他行

python - 无法在 Mac 上安装 Twisted 17.1.0

python - 在Python Polars生成excel中禁用负值的字体颜色格式

python - 在 Atom 中编写 Python 代码时,是否有一种巧妙的方法来调试 Python 代码?

python - Twisted串口dataReceived()提供碎片数据

python - 测试扭曲的应用程序 - 加载客户端

python - 来自 gmail 的 HIGHESTMODSEQ 响应

python - 扭曲的框架需要一些澄清

python - 在列表中拆分列表