Закладка вкладки python Mac OSX 10.7 (Lion)
Перед обновлением до льва у меня была полная вкладка в оболочку python через терминал. Следуя этим инструкциям, можно было завершить работу вкладки.
Начиная с обновления до Lion, я теперь не могу заставить вкладку завершить работу в терминальной сессии Python. Я выполнил приведенные выше инструкции к письму, и он все еще не работает.
Есть ли разница в модуле readline в Lion? Присоединение к опции "tab: complete" больше не работает. Мне интересно, является ли это терминалом, который игнорирует readline, или если это сам python.
Версия Python: 2.7.1
Edit:
По завершении вкладки, я имею в виду, что я мог бы сделать что-то вроде следующего:
# django
import MyModel
MyModel.objects.a[TAB] # will complete to all()
Ответы
Ответ 1
Apple не отправляет GNU readline
с OS X. Он отправляет BSD libedit, который включает интерфейс совместимости readline
. Система Pythons, поставляемая Apple и 64-разрядные/32-разрядные Pythons из установщиков python.org, построена с помощью libedit
. Проблема в том, что команды, поддерживаемые libedit
, полностью отличаются от команд readline
(см., Например, обсуждение здесь). Традиционные 32-битные инсталляторы python.org используют GNU readline
, как и другие сторонние дистрибьюторы Python для OS X, например MacPorts. Скорее всего, вы ранее использовали такой Python, а не недавний Apple. У вас есть несколько вариантов, помимо изменения Django: вы можете установить сторонний модуль замены readline; или вы можете использовать другой Python, который поставляется с GNU readline. Однако вы не должны использовать python.org 32-разрядные Python на 10.7, потому что, к сожалению, Xcode 4 на 10.7 больше не включает gcc-4.0
и OS X 10.4u SDK, которые эти Pythons должны создавать и устанавливать пакеты с C расширения модулей.
Включение в файл запуска python следующего этапа позволит выполнить вкладку как для интерфейса libedit, так и для обычного модуля readline. Для получения дополнительной информации о файле запуска python см. Здесь
import readline
import rlcompleter
if 'libedit' in readline.__doc__:
readline.parse_and_bind("bind ^I rl_complete")
else:
readline.parse_and_bind("tab: complete")
Ответ 2
Поскольку он использует libedit/editline, синтаксис включения автозаполнения немного отличается.
Вы можете сначала навязать привязки emacs (как и с readline, если я не ошибаюсь), набрав:
readline.parse_and_bind("bind -e")
Затем вы можете добавить автозаполнение, связанное с кнопкой TAB (man 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