Содержание страницы
13. Интерактивное редактирование ввода и подстановка истории¶Interactive Input Editing and History Substitution
Некоторые версии интерпретатора Python поддерживают редактирование текущей строки ввода и подстановку из истории, аналогично тому, что есть в оболочках Korn и GNU Bash. Это реализовано с помощью библиотеки GNU Readline, которая поддерживает редактирование в стиле Emacs и vi. У этой библиотеки есть собственная документация, которую я здесь не буду повторять; однако основные принципы легко объяснить. Описанные здесь интерактивное редактирование и подстановка из истории опционально доступны в версиях интерпретатора для Unix и Cygwin.
В этой главе не описываются средства редактирования пакета PythonWin Марка Хаммонда или среды IDLE на основе Tk, распространяемой вместе с Python. Вызов истории командной строки, работающий в окнах DOS на NT и некоторых других версиях DOS и Windows, – это совсем другое дело.
13.1. Редактирование строки¶Line Editing
Если поддерживается, редактирование строки ввода активно при выводе основного или дополнительного приглашения интерпретатора. Текущую строку можно редактировать с помощью стандартных управляющих символов Emacs. Наиболее важные из них: C-A (Control-A) перемещает курсор в начало строки, C-E – в конец, C-B перемещает на одну позицию влево, C-F – вправо. Backspace удаляет символ слева от курсора, C-D – справа от него. C-K удаляет часть строки справа от курсора, C-Y вставляет последнюю удалённую строку. C-underscore отменяет последнее изменение; можно повторять для накопления эффекта.
13.2. Подстановка истории¶History Substitution
Подстановка истории работает следующим образом. Все непустые введённые строки сохраняются в буфере истории, и при появлении нового приглашения пользователь оказывается на новой строке внизу этого буфера. C-P перемещает на одну строку вверх (назад) в буфере истории, C-N – на одну вниз. Любую строку в буфере истории можно редактировать; звёздочка появляется перед приглашением, чтобы отметить строку как изменённую. Нажатие клавиши Return передаёт текущую строку интерпретатору. C-R запускает инкрементальный обратный поиск; C-S запускает прямой поиск.
13.3. Привязки клавиш¶Key Bindings
Привязки клавиш и некоторые другие параметры библиотеки Readline можно настроить, поместив команды в файл инициализации с именем ~/.inputrc. Привязки клавиш имеют вид
key-name: function-name
или
"string": function-name
а параметры можно задать с помощью
set option-name value
Например:
# Я предпочитаю редактирование в стиле vi:
set editing-mode vi
# Редактирование одной строкой:
set horizontal-scroll-mode On
# Переназначить некоторые клавиши:
Meta-h: backward-kill-word
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
Обратите внимание, что привязка по умолчанию для Tab в Python – вставка символа Tab, а не функция завершения имён файлов Readline. Если необходимо, это можно переопределить, поместив
Tab: complete
в ваш ~/.inputrc. (Конечно, это усложняет ввод строк продолжения с отступом, если вы привыкли использовать для этого Tab.)
Автоматическое дополнение имён переменных и модулей опционально доступно. Чтобы включить его в интерактивном режиме интерпретатора, добавьте следующее в ваш файл запуска: 1
import rlcompleter, readline
readline.parse_and_bind('tab: complete')
Это привязывает клавишу Tab к функции завершения, так что двукратное нажатие Tab предлагает варианты завершения; она просматривает имена операторов Python, текущие локальные переменные и доступные имена модулей. Для выражений с точками, таких как string.a, она вычисляет выражение до последней '.', а затем предлагает завершения из атрибутов результирующего объекта. Обратите внимание, что это может выполнять определённый приложением код, если в выражении участвует объект с методом __getattr__().
Более функциональный файл запуска может выглядеть как этот пример. Обратите внимание, что он удаляет созданные имена, как только они становятся не нужны; это сделано потому, что файл запуска выполняется в том же пространстве имён, что и интерактивные команды, и удаление имён позволяет избежать побочных эффектов в интерактивной среде. Возможно, вам будет удобно сохранить некоторые импортированные модули, например os, которые, как оказывается, нужны в большинстве сеансов работы с интерпретатором.
# Добавить автодополнение и сохранение истории команд в ваш Python
# интерактивный интерпретатор. Требуется Python 2.0+ и readline. Автодополнение
# привязано к клавише Esc по умолчанию (можно изменить – см. документацию readline).
#
# Сохраните файл в ~/.pystartup и установите переменную окружения, указывающую на
# для этого: "export PYTHONSTARTUP=~/.pystartup" в bash.
import atexit
import os
import readline
import rlcompleter
historyPath = os.path.expanduser("~/.pyhistory")
def save_history(historyPath=historyPath):
import readline
readline.write_history_file(historyPath)
if os.path.exists(historyPath):
readline.read_history_file(historyPath)
atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath
13.4. Альтернативы интерактивному интерпретатору¶Alternatives to the Interactive Interpreter
Эта возможность является огромным шагом вперед по сравнению с более ранними версиями интерпретатора; однако остаются некоторые пожелания: было бы хорошо, если бы правильный отступ предлагался на строках продолжения (парсер знает, требуется ли следующий токен отступа). Механизм автодополнения мог бы использовать таблицу символов интерпретатора. Также была бы полезна команда для проверки (или даже предложения) соответствующих скобок, кавычек и т.д.
Одной из альтернатив с расширенными возможностями, которая существует уже довольно давно, является IPython. Он предлагает автодополнение по табуляции, исследование объектов и расширенное управление историей. Его также можно тщательно настраивать и встраивать в другие приложения. Другая подобная среда с расширенными возможностями – bpython.
Сноски
- 1
Python выполнит содержимое файла, указанного переменной окружения
PYTHONSTARTUP, при запуске интерактивного интерпретатора. Чтобы настроить Python даже для неинтерактивного режима, см. Модули настройки.