簡體   English   中英

python選項卡完成Mac OSX 10.7(Lion)

[英]python tab completion Mac OSX 10.7 (Lion)

在升級到lion之前,我通過終端在python shell中完成了tab。 按照這些說明 ,可以使標簽完成工作。

自升級到Lion以來,我現在無法在Python的終端會話中完成選項卡的完整工作。 我按照上面的說明寫了這封信,但它仍然不起作用。

Lion中的readline模塊有什么不同嗎? 掛鈎'tab:complete'選項似乎不再起作用。 我想知道它是否是忽略readline的終端,或者它是否是python本身。

Python版本:2.7.1

編輯:

通過選項卡完成,我的意思是我可以執行以下操作:

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

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

將以下內容放在python啟動文件中將為libedit接口和典型的readline模塊啟用選項卡完成。 有關python啟動文件的更多信息, 請參閱此處

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

由於它使用libedit / editline,啟用自動完成的語法有點不同。 您可以通過輸入以下內容來強制執行emacs綁定(如果我沒有錯,則使用readline)

readline.parse_and_bind("bind -e")

然后你可以添加鏈接到你的TAB按鈕的自動完成(man 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM