Tab-completion in Python interpreter in OS X Terminal
Question: Several months ago, I wrote a [blog
post](http://igotgenes.blogspot.com/2009/01/tab-completion-and-history-in-
python.html) detailing how to achieve tab-completion in the standard Python
interactive interpreter--a feature I once thought only available in IPython.
I've found it tremendously handy given that I sometimes have to switch to the
standard interpreter due to IPython unicode issues.

Recently I've done some work in OS X. To my discontent, the script doesn't
seem to work for OS X's Terminal application. I'm hoping some of you with
experience in OS X might be able to help me trouble-shoot it so it can work in
Terminal, as well.

I am reproducing the code below

    
    
    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))
    

Note that I have slightly edited it from the version on my blog post so that
the `IrlCompleter` is initialized with a true tab, which seems to be what is
output by the Tab key in Terminal.


Answer: This should work under Leopard's python:

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

Whereas this one does not:

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

Save it in ~/.pythonrc.py and execute in .bash_profile

    
    
    export PYTHONSTARTUP=$HOME/.pythonrc.py
    

