Завершение табуляции в интерпретаторе Python в терминале OS X
Несколько месяцев назад я написал сообщение в блоге, в котором подробно описывалось, как добиться завершения табуляции в стандартном интерактивном интерпретаторе Python - функция, которую я однажды мысль доступна только в IPython. Я нашел это чрезвычайно удобным, учитывая, что мне иногда приходится переключаться на стандартный интерпретатор из-за проблем с юникодом IPython.
Недавно я сделал некоторую работу в OS X. К моему недовольству, script, похоже, не работает для приложения OS X Terminal. Я надеюсь, что некоторые из вас с опытом работы в 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 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
инициализируется закладкой true, которая, как представляется, выводится клавишей Tab в терминале.
Ответы
Ответ 1
Чтобы избежать необходимости использовать больше кода GPL, Apple не включает в себя реальный уровень чтения. Вместо этого он использует BSD-лицензированный libedit, который только в основном совместим с readline. Создайте свой собственный Python (или используйте Fink или MacPorts), если вы хотите завершить.
Ответ 2
Это должно работать под 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
Ответ 3
здесь представлена полная кросс-платформенная версия загрузки вкладки для 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
Ответ 4
Это работает для меня как на Linux bash, так и на OS X 10.4
import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
Ответ 5
Если после попытки вывести это все еще не работает, попробуйте выполнить в оболочке:
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 и Nicolas для содержимого файла.
Ответ 6
Задокументированный способ сообщить libedit (полуочистка Mac OS) из реального: если "libedit" в readline. doc: проход # Mac case еще: pass # GNU readline case
Ответ 7
После сбоя во многих проблемах, связанных с Python (2 и 3) на FreeBSD, я наконец получил правильное расширение для работы с использованием libedit непосредственно в качестве дополнения для Python.
Основная проблема с libedit/readline заключается в том, что завершение и ввод Python сильно исказились в отношении readline GNU... К сожалению, на самом деле это не очень хороший интерфейс. Это требует огромного количества глобальных комбинаций в C и не работает хорошо на основе "экземпляра".
Решение:
https://github.com/mark-nicholson/python-editline
Это истинное отдельное расширение python, которое напрямую ссылается на libedit, используя фактический интерфейс libedit, а не на клейте readline на стороне.
Я тестировал его довольно подробно на Ubuntu, FreeBSD, OpenBSD, NetBSD и MacOS - результаты публикуются в readme. C-код очень чист и практически не имеет битов, зависящих от платформы, в отличие от модуля readline.c в Python.
Примечания: Он работает на Python3 > 3.2. Это НЕ замена для "read readline" в других сценариях, но эти сценарии можно легко отрегулировать. Он может сосуществовать с readline.so - есть код для файла sitecustomize.py, который позволяет выбирать. Он может использовать дистрибутив "libedit.so", специально построенный или libedit, встроенный в само расширение.