2010-01-12 29 views
5

我正在Python中編寫一個小CLI(作爲Mercurial的擴展),並且希望支持Tab完成。具體來說,我想在提示符中捕捉選項卡,並顯示匹配選項列表(就像bash)。Python命令行界面中的Tab完成 - 如何捕捉Tab事件

例子:輸入部分名稱:

ext*TAB* 
extensions 
extras 

的問題是我不知道如何捕捉到標籤事件。我正在使用Mercurial的ui.prompt() API,它只是在底層調用raw_input()

據我所知,raw_input()只返回'輸入',如果用戶輸入一個標籤,返回的字符串只包括一個"\t"

回答

15

爲此,您使用readline模塊。

最簡單的代碼,我能想到的:

import readline 
COMMANDS = ['extra', 'extension', 'stuff', 'errors', 
      'email', 'foobar', 'foo'] 

def complete(text, state): 
    for cmd in COMMANDS: 
     if cmd.startswith(text): 
      if not state: 
       return cmd 
      else: 
       state -= 1 

readline.parse_and_bind("tab: complete") 
readline.set_completer(complete) 
raw_input('Enter section name: ') 

用法示例:

Enter section name: <tab> 
email  errors  extension extra  foo  foobar stuff 
Enter section name: e<tab> 
email  errors  extension extra  
Enter section name: ext<tab> 
extension extra  

而且完成,readline爲您提供:

  • 行編輯
  • 鍵綁定配置(通常Emacs和vi模式)
  • 歷史(向上箭頭回憶以前的值)
  • 歷史記錄檢索,保存和載入
+0

謝謝,這正是我所希望的!只有一個問題 - 我無法在我的主系統上運行。我使用Python 2.6在OSX 10.6上,它只是插入'\ t'。所以我啓動了Ubuntu,它在那裏工作得很好 - 你知道是否有一個圖書館是一個更獨立於平臺的方式嗎? – Paulitex 2010-01-12 02:37:20

+6

Apple提供的Pythons不使用GNU readline庫;他們使用BSD派生的編輯線庫。來自python.org的OS X的Python安裝程序使用GNU readline,就像使用MacPorts安裝的最近的Pythons一樣。 – 2010-01-12 03:34:37

2

如何做製表完成在合作與readline一個很好的例子在標準庫作爲供應rlcompleter模塊 - 你不能按原樣使用它(它根據當前在Python主內置庫中定義的名稱完成),但是它顯示瞭如何完成一般任務以及如何將它連接到readline

1

你應該幾乎可以肯定地使用cmd module,它已經實現了製表符完成等等,也可能是你想要做的其他部分,使用readline模塊等等。重新發明輪子沒有意義。