Tab-conclusão no interpretador no terminal OS X
-
21-08-2019 - |
Pergunta
Alguns meses atrás, eu escrevi um href="http://igotgenes.blogspot.com/2009/01/tab-completion-and-history-in-python.html" rel="noreferrer"> blogue detalhando como conseguir guia-conclusão no interpretador interativo padrão Python - uma característica que eu pensava só está disponível em IPython. Eu achei extremamente útil dado que eu às vezes tem que mudar para o intérprete padrão devido a questões unicode ipython.
Recentemente eu fiz algum trabalho no OS X. Para meu descontentamento, o script não parece trabalho para a aplicação Terminal do OS X. Eu estou esperando que alguns de vocês com experiência em OS X pode ser capaz de me ajudar trouble-shoot-lo para que ele possa trabalhar no Terminal, também.
Eu estou reproduzindo o código abaixo
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 que eu tenho ligeiramente editado a partir da versão no meu blog para que o IrlCompleter
é inicializado com um verdadeiro guia, que parece ser o que é emitido pela tecla Tab no Terminal.
Solução
Para evitar ter que usar mais código GPL, a Apple não inclui um readline real. Em vez disso, usa a licença BSD libedit , que é apenas principalmente-readline compatível. Construir o seu próprio Python (ou uso Fink ou MacPorts) se quiser conclusão.
Outras dicas
Isso deve funcionar sob python do Leopard:
import rlcompleter
import readline
readline.parse_and_bind ("bind ^I rl_complete")
Considerando que este não faz:
import readline, rlcompleter
readline.parse_and_bind("tab: complete")
Save-lo em ~ / .pythonrc.py e executar no .bash_profile
export PYTHONSTARTUP=$HOME/.pythonrc.py
aqui é uma versão de plataforma cruzada cheia de conclusão de tabulação carregamento para Windows / Mac OS X / Linux em um único tiro:
#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")
A partir http://www.farmckon.net/?p=181
Isso funciona para mim, tanto o bash Linux e OS X 10.4
import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
Se depois de tentar o acima, ele ainda não funcionar, tente executar no shell:
sudo easy_install readline
Em seguida, crie ~ / .profile arquivo com o conteúdo:
export PYTHONSTARTUP=$HOME/.pythonrc.py
e ~ / .pythonrc.py arquivo com o conteúdo:
try:
import readline
except:
print ("Module readline is not available.")
else:
import rlcompleter
readline.parse_and_bind("tab: complete")
Graças à Steven Bamford para a ponta easy_install e Nicolas para o conteúdo do arquivo.
A maneira documentada para dizer libedit (o semi-readline Mac OS) do real é: se "libedit" em readline doc .: passar o caso # Mac outro: passar caso readline # GNU
Depois de bater em muitas questões relacionadas com Python (2 e 3) no FreeBSD, eu finalmente consegui uma extensão adequada ao trabalho usando libedit diretamente como a completer para Python.
A questão básica com libedit / readline é que a conclusão ea entrada do Python foi fortemente curvada em direção GNU readline ... Infelizmente, este não é realmente um particularmente boa interface. Ela exige um número gigante de globals em C e não funciona bem em uma base "instância".
Solução:
https://github.com/mark-nicholson/python-editline
Esta é uma verdadeira extensão python separado que diretamente links para libedit usando a interface real "libedit." - não a cola readline no lado
Eu testei isso muito bem no Ubuntu, FreeBSD, OpenBSD, NetBSD e MacOS - resultados são afixados no readme. O c-código é muito limpo e tem praticamente nenhum bit dependentes da plataforma -. Ao contrário do módulo readline.c em Python
Notas: Ele funciona em Python3> 3.2. Não é um substituto para o 'readline importação' em outros scripts, mas esses scripts podem ser facilmente ajustada. Ele pode coexistir com readline.so - não é o código para um arquivo sitecustomize.py que permite a seleção. Ele pode usar uma distribuição 'libedit.so', um costume construído um ou libedit construído no próprio extensão.