2011-08-19 121 views
42

在升級到獅子之前,我已經通過終端在一個python shell中完成了tab工作。在these instructions之後,可以使選項卡完整工作。python tab完成Mac OSX 10.7(Lion)

自從升級到Lion後,我現在無法在Python的終端會話中完成標籤的完成工作。我已經按照上面的說明去信了,但它仍然不起作用。

Lion與readline模塊有區別嗎?連接到'tab:complete'選項似乎不再有效。我想知道是否終端是忽略readline,或者它是否是python本身。

Python版本:2.7.1

編輯:

由製表完成後,我的意思是我可以做類似如下:

# django 
import MyModel 
MyModel.objects.a[TAB] # will complete to all() 
+0

你之前完成了什麼樣的東西? –

+0

你有沒有考慮過使用類似ipython或bpython的東西? –

+0

如果它仍然無法正常工作,請參閱[我在另一篇文章中的回答](http://stackoverflow.com/questions/675370/tab-completion-in-python-interpreter-in-os-x-terminal/23908884# 23908884)。 –

回答

102

蘋果不出貨GNU readline與OS X它運送BSD libedit其中包括readline兼容性接口。 Apple提供的Pythons系統和python.org安裝程序提供的64位/ 32位Pythons均使用libedit構建。問題是libedit支持的命令與readline完全不同(參見例如討論here)。傳統的僅32位的python.org安裝程序的確使用GNU readline,就像其他一些用於OS X的Python的第三方分發者一樣,比如MacPorts。有可能你以前使用過這樣的Python,而不是最近的Apple。除了修改Django之外,您還有幾個選項:您可以安裝第三方替換模塊readline模塊;或者你可以使用GNU readline附帶的另一個Python。然而,你不應該在10.7上使用python.org 32位Python,因爲不幸的是,10.7上的Xcode 4不再包含gcc-4.0和OS X 10.4u SDK,這些Pythons需要用C擴展模塊構建和安裝包。

把在Python啓動文件下面將啓用兩個libedit接口和典型的readline模塊選項卡完成。有關蟒蛇啓動文件的詳細信息,see here

import readline 
import rlcompleter 
if 'libedit' in readline.__doc__: 
    readline.parse_and_bind("bind ^I rl_complete") 
else: 
    readline.parse_and_bind("tab: complete") 
+0

我曾經使用pyx 2.7與osx 10.6,所以它不是系統python。我相信你說的正確。由於我用於Django的一些oracle庫,我必須使用系統python。 –

+0

我添加了解決方案,讓標籤完成工作到您的答案,而不是創建一個新的答案,因爲答案中的信息要好得多。隨意刪除它,如果你喜歡,我會創建一個新的答案。乾杯 –

12

,因爲它使用libedit/editline,語法啓用自動完成是有一點點不同。 你可以先通過鍵入強制emacs的綁定(因爲它是如果我沒看錯的ReadLine):

readline.parse_and_bind("bind -e")

然後你就可以自動完成添加鏈接到您的TAB鍵(男editrc):

readline.parse_and_bind("bind '\t' rl_complete")

如果你想支持縮進和有歷史(互聯網上找到),它應該是一個(除非我犯了一個錯誤):

import readline,rlcompleter 

### Indenting 
class TabCompleter(rlcompleter.Completer): 
    """Completer that supports indenting""" 
    def complete(self, text, state): 
     if not text: 
      return (' ', None)[state] 
     else: 
      return rlcompleter.Completer.complete(self, text, state) 

readline.set_completer(TabCompleter().complete) 

### Add autocompletion 
if 'libedit' in readline.__doc__: 
    readline.parse_and_bind("bind -e") 
    readline.parse_and_bind("bind '\t' rl_complete") 
else: 
    readline.parse_and_bind("tab: complete") 

### Add history 
import os 
histfile = os.path.join(os.environ["HOME"], ".pyhist") 
try: 
    readline.read_history_file(histfile) 
except IOError: 
    pass 
import atexit 
atexit.register(readline.write_history_file, histfile) 
del histfile