web-dev-qa-db-ja.com

pythonタブ補完Mac OSX 10.7(ライオン)

ライオンにアップグレードする前に、pythonターミナル経由のシェルでタブを完全に機能させました。 これらの手順 に従って、タブを完全に機能させることができました。

Lionにアップグレードしてから、Pythonのターミナルセッションでタブを完全に機能させることができなくなりました。上記の指示に従って手紙を書いても、まだうまくいきません。

Lionのreadlineモジュールとの違いはありますか? 「tab:complete」オプションへのフックは機能しなくなったようです。 readlineを無視しているのがターミナルなのか、それともpython自体なのか?.

Pythonバージョン:2.7.1

編集:

タブ完成とは、次のようなことができることを意味します。

# Django
import MyModel
MyModel.objects.a[TAB] # will complete to all()
45
Josh Smeaton

Appleは、OS XにGNU readlineを同梱していません。readline互換性インターフェースを含む BSD libedit を同梱しています。システムAppleによって出荷されたPythonおよびpython.orgインストーラーからの64ビット/ 32ビットPythonは、libeditでビルドされています。問題は、libeditreadlineのものとは完全に異なります(たとえば、ディスカッション here を参照してください)。従来の32ビットのみのpython.orgインストーラーはGNU readline MacPortsのようなOS X用のPythonの他のサードパーティディストリビューターと同様に。以前はそのようなPythonであり、最近のApple one。ではありません。Djangoを変更する以外に、いくつかのオプションがあります:サードパーティの置換 readline モジュールをインストールできます;またはPython readlineに付属する別のGNUを使用できます。ただし、10.7ではpython.org 32ビットのみのPythonを使用しないでください。 、10.7のXcode 4はクルードgcc-4.0およびOS X 10.4u SDK。これらのPythonは、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")
105
Ned Deily

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
13
Camille