завершение вкладки Python Mac OSX 10.7 (Lion) - PullRequest
45 голосов
/ 19 августа 2011

Перед обновлением до lion у меня была полная работа с вкладками в оболочке python через терминал.Следуя этим инструкциям , можно было завершить работу с вкладками.

После обновления до Lion теперь я не могу завершить работу с вкладками в терминальной сессии Python.Я следовал приведенным выше инструкциям к письму, и оно все еще не работает.

Есть ли разница с модулем readline в Lion?Привязка к опции «tab: complete» больше не работает.Мне интересно, является ли это терминал, который игнорирует readline, или это сам Python.

Версия Python: 2.7.1

Редактировать:

По завершенной вкладке,Я имею в виду, я мог бы сделать что-то вроде следующего:

# django
import MyModel
MyModel.objects.a[TAB] # will complete to all()

Ответы [ 2 ]

105 голосов
/ 19 августа 2011

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-битные только Pythons на 10.7, потому что, к сожалению, Xcode 4 на 10.7 больше не включает gcc-4.0 и OS X 10.4u SDK, которые эти Питоны должны собирать и устанавливать пакеты с 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")
13 голосов
/ 10 ноября 2011

Поскольку он использует 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
...