2010-07-14 172 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