2011-08-19 16 views
42

ライオンにアップグレードする前に、タブを介してPythonシェルで作業が完了しました。 these instructionsに続いて、タブ完全な作業が可能でした。pythonタブ補完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

AppleがOS XとGNU readlineを出荷しません。 readline互換インターフェイスを含むBSD libeditを出荷しています。 Appleが出荷したPythonsシステムとpython.orgインストーラの64ビット/ 32ビットPythonはlibeditで構築されています。問題は、libeditでサポートされているコマンドがreadlineのコマンドと完全に異なることです(たとえば、hereの説明を参照してください)。伝統的な32ビット専用のpython.orgインストーラは、MacPortsのように、Python for OS Xの他のサードパーティディストリビュータと同様にGNU readlineを使用しています。あなたが以前にそのようなPythonを使っていて、最近のAppleのものではない可能性があります。あなたはDjangoを変更する以外にいくつかのオプションがあります:サードパーティの交換用のreadlineモジュールをインストールすることができます。 GNU readlineに付属の別のPythonを使うこともできます。しかし、残念なことに10.7のXcode 4にはgcc-4.0と、PythonがC拡張モジュールでパッケージをビルドしてインストールするために必要なOS X 10.4u SDKが含まれていないため、python.orgの32ビット専用Pythonを10.7で使用しないでください。

次の行をpythonスタートアップファイルに入れると、libeditインターフェースと一般的なreadlineモジュールの両方でタブ補完が有効になります。それはlibeditの/ editlineを使用するとPythonの起動ファイルの詳細については、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

私はosx 10.6でpython 2.7を使用していましたので、システムのpythonではありませんでした。私はあなたがあなたが言っていることにあなたが正しいと信じています。私はdjangoのために使用しているいくつかのOracleライブラリのため、システムのPythonを使用する必要があります。 –

+0

答えの情報がはるかに優れているため、新しい補完を作成するのではなく、補完にタブ補完を働かせるためのソリューションを追加しました。好きなだけ自由に削除してください。新しい回答を作成します。乾杯 –

12

、自動補完を有効にするには、構文は少し異なっています。 (それは私が間違っていないよ場合readlineのであるとして) あなたは最初に入力してemacsのバインディングを強制することができます。

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 
関連する問題