readline — Интерфейс GNU readline
Модуль readline определяет ряд функций для облегчения автодополнения и чтения/записи файлов истории из интерпретатора Python. Этот модуль может быть использован напрямую или через модуль rlcompleter, который поддерживает автодополнение идентификаторов Python в интерактивном режиме. Настройки, выполненные с помощью этого модуля, влияют на поведение как интерактивного приглашения интерпретатора, так и приглашений, предлагаемых встроенной функцией input().
Настройки сочетаний клавиш readline могут быть сконфигурированы через файл инициализации, обычно .inputrc в вашем домашнем каталоге. Обратитесь к разделу «Readline Init File» в руководстве GNU Readline для получения информации о формате и допустимых конструкциях этого файла, а также о возможностях библиотеки Readline в целом.
Примечание
API базовой библиотеки Readline может быть реализован библиотекой libedit вместо GNU readline. В macOS модуль readline определяет используемую библиотеку во время выполнения.
Файл конфигурации для libedit отличается от файла конфигурации GNU readline. Если вы программно загружаете строки конфигурации, вы можете проверить текст «libedit» в readline.__doc__ для различения между GNU readline и libedit.
Если вы используете эмуляцию editline/libedit readline в macOS, файл инициализации, расположенный в вашем домашнем каталоге, называется .editrc. Например, следующее содержимое ~/.editrc включит сочетания клавиш vi и автодополнение по TAB:
python:bind -v python:bind ^I rl_complete
Также обратите внимание, что различные библиотеки могут использовать различные форматы файлов истории. При смене базовой библиотеки существующие файлы истории могут стать непригодными для использования.
Файл инициализации
Следующие функции относятся к файлу инициализации и пользовательской конфигурации:
-
readline.parse_and_bind(string) -
Выполняет строку инициализации, указанную в аргументе string. Это вызывает
rl_parse_and_bind()в базовой библиотеке.
-
readline.read_init_file([filename]) -
Выполняет файл инициализации readline. Имя файла по умолчанию — последнее использованное имя файла. Это вызывает
rl_read_init_file()в базовой библиотеке.
Буфер строки
Следующие функции работают с буфером строки:
-
readline.get_line_buffer() -
Возвращает текущее содержимое буфера строки (
rl_line_bufferв базовой библиотеке).
-
readline.insert_text(string) -
Вставляет текст в буфер строки в позиции курсора. Это вызывает
rl_insert_text()в базовой библиотеке, но игнорирует возвращаемое значение.
-
readline.redisplay() -
Изменяет отображаемое на экране содержимое, чтобы отразить текущее содержимое буфера строки. Это вызывает
rl_redisplay()в базовой библиотеке.
Файл истории
Следующие функции работают с файлом истории:
-
readline.read_history_file([filename]) -
Загружает файл истории readline и добавляет его в список истории. Имя файла по умолчанию —
~/.history. Это вызываетread_history()в базовой библиотеке.
-
readline.write_history_file([filename]) -
Сохраняет список истории в файл истории readline, перезаписывая любой существующий файл. Имя файла по умолчанию —
~/.history. Это вызываетwrite_history()в базовой библиотеке.
-
readline.append_history_file(nelements[, filename]) -
Добавляет последние nelements элементов истории в файл. Имя файла по умолчанию —
~/.history. Файл должен уже существовать. Это вызываетappend_history()в базовой библиотеке. Эта функция существует только если Python был скомпилирован для версии библиотеки, которая её поддерживает.Добавлена в версии 3.5.
-
readline.get_history_length() -
readline.set_history_length(length) -
Устанавливает или возвращает желаемое количество строк для сохранения в файле истории. Функция
write_history_file()использует это значение для усечения файла истории, вызываяhistory_truncate_file()в базовой библиотеке. Отрицательные значения означают неограниченный размер файла истории.
Список истории
Следующие функции работают со глобальным списком истории:
-
readline.clear_history() -
Очищает текущую историю. Это вызывает
clear_history()в базовой библиотеке. Функция Python существует только если Python был скомпилирован для версии библиотеки, которая её поддерживает.
-
readline.get_current_history_length() -
Возвращает количество элементов в текущей истории. (Это отличается от
get_history_length(), которая возвращает максимальное количество строк, которые будут записаны в файл истории.)
-
readline.get_history_item(index) -
Возвращает текущее содержимое элемента истории по индексу. Индекс элемента — однобазисный.
Это вызывает
history_get()в базовой библиотеке.
-
readline.remove_history_item(pos) -
Удаляет элемент истории, указанный его позицией, из истории. Позиция нулевая.
Это вызывает
remove_history()в базовой библиотеке.
-
readline.replace_history_item(pos, line) -
Заменяет элемент истории, указанный его позицией, на строку. Позиция нулевая.
Это вызывает
replace_history_entry()в базовой библиотеке.
-
readline.add_history(line) -
Добавляет строку в буфер истории, как будто это последняя набранная строка.
Это вызывает
add_history()в базовой библиотеке.
-
readline.set_auto_history(enabled) -
Включает или отключает автоматические вызовы
add_history()при чтении ввода через readline. Аргумент enabled должен быть булевым значением: true — включает авто-историю, false — отключает.Добавлена в версии 3.6.
Деталь реализации CPython: Авто-история включена по умолчанию и изменения не сохраняются между сессиями.
Запускающие хуки
-
readline.set_startup_hook([function]) -
Устанавливает или удаляет функцию, вызываемую обратным вызовом
rl_startup_hookбазовой библиотеки. Если функция указана, она будет использоваться в качестве новой функции хука; если опущена илиNone, любая уже установленная функция удаляется. Хук вызывается без аргументов перед тем, как readline отобразит первое приглашение.
-
readline.set_pre_input_hook([function]) -
Устанавливает или удаляет функцию, вызываемую обратным вызовом
rl_pre_input_hookбазовой библиотеки. Если функция указана, она будет использоваться в качестве новой функции хука; если опущена илиNone, любая уже установленная функция удаляется. Хук вызывается без аргументов после отображения первого приглашения и перед тем, как readline начнет читать символы ввода. Эта функция существует только если Python был скомпилирован для версии библиотеки, которая её поддерживает.
Автозаполнение
Следующие функции связаны с реализацией пользовательской функции автозаполнения слов. Как правило, она активируется нажатием клавиши Tab и может предлагать и автоматически завершать ввод слова. По умолчанию Readline настроен на использование модуля rlcompleter для автозаполнения идентификаторов Python в интерактивном интерпретаторе. Если модуль readline должен использоваться с пользовательской функцией автозаполнения, необходимо установить другие разделители слов.
-
readline.set_completer([function]) -
Установить или удалить функцию автозаполнения. Если указана function, она будет использоваться в качестве новой функции автозаполнения; если она опущена или
None, любая установленная ранее функция автозаполнения будет удалена. Функция автозаполнения вызывается какfunction(text, state), для state в0,1,2, …, пока она не вернёт значение, отличное от строки. Она должна вернуть следующее возможное завершение, начинающееся с text.Установленная функция автозаполнения вызывается обратным вызовом entry_func, переданным в модуль
rl_completion_matches()в базовой библиотеке. Строка text поступает из первого параметра обратного вызоваrl_attempted_completion_functionбазовой библиотеки.
-
readline.get_completer() -
Получить функцию автозаполнения или
Noneв случае, если функция автозаполнения не установлена.
-
readline.get_completion_type() -
Получить тип выполняемого автозаполнения. Это возвращает переменную
rl_completion_typeв базовой библиотеке в виде целого числа.
-
readline.get_begidx() -
readline.get_endidx() -
Получить начальный или конечный индекс области автозаполнения. Эти индексы — аргументы start и end, передаваемые обратному вызову
rl_attempted_completion_functionбазовой библиотеки. Значения могут отличаться в одном и том же сценарии редактирования ввода, в зависимости от реализации базовой библиотеки C readline. Например, известно, что libedit ведёт себя иначе, чем libreadline.
-
readline.set_completer_delims(string) -
readline.get_completer_delims() -
Установить или получить разделители слов для автозаполнения. Они определяют начало слова, которое будет рассматриваться для автозаполнения (область автозаполнения). Эти функции обращаются к переменной
rl_completer_word_break_charactersв базовой библиотеке.
-
readline.set_completion_display_matches_hook([function]) -
Установить или удалить функцию отображения результатов автозаполнения. Если указана function, она будет использоваться в качестве новой функции отображения результатов автозаполнения; если она опущена или
None, любая установленная ранее функция отображения результатов автозаполнения будет удалена. Это устанавливает или очищает обратный вызовrl_completion_display_matches_hookв базовой библиотеке. Функция отображения результатов автозаполнения вызывается какfunction(substitution, [matches], longest_match_length)один раз каждый раз, когда результаты нужно отобразить.
Пример
Следующий пример демонстрирует, как использовать функции чтения и записи истории модуля readline для автоматической загрузки и сохранения файла истории с именем .python_history из домашнего каталога пользователя. Код ниже обычно выполняется автоматически во время интерактивных сессий из файла PYTHONSTARTUP пользователя.
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
readline.read_history_file(histfile)
# default history len is -1 (infinite), which may grow unruly
readline.set_history_length(1000)
except FileNotFoundError:
pass
atexit.register(readline.write_history_file, histfile)
Этот код фактически автоматически выполняется при запуске Python в интерактивном режиме (см. Настройка Readline).
Следующий пример достигает той же цели, но поддерживает одновременные интерактивные сессии, добавляя только новые записи в историю.
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
readline.read_history_file(histfile)
h_len = readline.get_current_history_length()
except FileNotFoundError:
open(histfile, 'wb').close()
h_len = 0
def save(prev_h_len, histfile):
new_h_len = readline.get_current_history_length()
readline.set_history_length(1000)
readline.append_history_file(new_h_len - prev_h_len, histfile)
atexit.register(save, h_len, histfile)
Следующий пример расширяет класс code.InteractiveConsole для поддержки сохранения/восстановления истории.
import atexit
import code
import os
import readline
class HistoryConsole(code.InteractiveConsole):
def __init__(self, locals=None, filename="<console>",
histfile=os.path.expanduser("~/.console-history")):
code.InteractiveConsole.__init__(self, locals, filename)
self.init_history(histfile)
def init_history(self, histfile):
readline.parse_and_bind("tab: complete")
if hasattr(readline, "read_history_file"):
try:
readline.read_history_file(histfile)
except FileNotFoundError:
pass
atexit.register(self.save_history, histfile)
def save_history(self, histfile):
readline.set_history_length(1000)
readline.write_history_file(histfile)
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/readline.html