21

数か月前、私は標準の Python インタラクティブ インタープリターでタブ補完を実現する方法を詳述したブログ記事を書きました。IPython Unicode の問題が原因で標準インタープリターに切り替える必要がある場合があることを考えると、非常に便利であることがわかりました。

最近、私は OS X でいくつかの作業を行いました。不満なことに、このスクリプトは OS X のターミナル アプリケーションでは機能しないようです。OS X の経験のある方が、ターミナルでも動作するようにトラブルシューティングを手伝ってくれることを願っています。

以下のコードを再現しています

import atexit
import os.path

try:
    import readline
except ImportError:
    pass
else:
    import rlcompleter

    class IrlCompleter(rlcompleter.Completer):
        """
        This class enables a "tab" insertion if there's no text for
        completion.

        The default "tab" is four spaces. You can initialize with '\t' as
        the tab if you wish to use a genuine tab.

        """

        def __init__(self, tab='    '):
            self.tab = tab
            rlcompleter.Completer.__init__(self)


        def complete(self, text, state):
            if text == '':
                readline.insert_text(self.tab)
                return None
            else:
                return rlcompleter.Completer.complete(self,text,state)


    #you could change this line to bind another key instead tab.
    readline.parse_and_bind('tab: complete')
    readline.set_completer(IrlCompleter('\t').complete)


# Restore our command-line history, and save it when Python exits.
history_path = os.path.expanduser('~/.pyhistory')
if os.path.isfile(history_path):
    readline.read_history_file(history_path)
atexit.register(lambda x=history_path: readline.write_history_file(x))

IrlCompleterが真のタブで初期化されるように、ブログ投稿のバージョンから少し編集したことに注意してください。これは、ターミナルの Tab キーによって出力されるようです。

4

7 に答える 7

56

これは Leopard の python で動作するはずです:

import rlcompleter
import readline
readline.parse_and_bind ("bind ^I rl_complete")

これはしませんが:

import readline, rlcompleter
readline.parse_and_bind("tab: complete")

~/.pythonrc.py に保存して .bash_profile で実行

export PYTHONSTARTUP=$HOME/.pythonrc.py
于 2009-06-12T15:43:41.730 に答える
11

これは、Windows/OS X/Linux のローディング タブ補完の完全なクロス プラットフォーム バージョンです。

#Code  UUID = '9301d536-860d-11de-81c8-0023dfaa9e40'
import sys
try:
        import readline
except ImportError:
        try:
                import pyreadline as readline
        # throw open a browser if we fail both readline and pyreadline
        except ImportError:
                import webbrowser
                webbrowser.open("http://ipython.scipy.org/moin/PyReadline/Intro#line-36")
                # throw open a browser
        #pass
else:
        import rlcompleter
        if(sys.platform == 'darwin'):
                readline.parse_and_bind ("bind ^I rl_complete")
        else:
                readline.parse_and_bind("tab: complete")

http://www.farmckon.net/?p=181より

于 2009-08-11T01:52:21.400 に答える
8

より多くの GPL コードを使用する必要がないように、Apple は実際の readline を含めていません。代わりに、BSD ライセンスのlibeditを使用します。これはほとんど readline とのみ互換性があります。完成させたい場合は、独自の Python をビルドします (または Fink または MacPorts を使用します)。

于 2009-03-26T11:47:57.620 に答える
1

これは、LinuxbashとOSX10.4の両方で機能します

import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
于 2009-03-23T23:11:58.017 に答える
1

上記を試してもうまくいかない場合は、シェルで実行してみてください。

sudo easy_install readline

次に、次の内容で~/.profileファイルを作成します。

export PYTHONSTARTUP=$HOME/.pythonrc.py

~ /.pythonrc.pyファイルの内容は次のとおりです。

try:
    import readline
except:
    print ("Module readline is not available.")
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

easy_install のヒントを提供してくれたSteven Bamfordと、ファイルの内容を提供してくれたNicolasに感謝します。

于 2014-05-28T10:17:56.927 に答える
0

libedit (Mac OS のセミ readline) と実際のものを区別する文書化された方法は次のとおりです。doc : pass # Mac ケース else: pass # GNU readline ケース

于 2016-05-16T19:25:27.473 に答える