Подтвердить что ты не робот

Закладка вкладки 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()
4b9b3361

Ответ 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