readline — GNU readline интерфейс
Модуль readline определяет ряд функций для облегчения автодополнения и чтения/записи файлов истории из интерпретатора Python. Этот модуль может быть использован напрямую или через модуль rlcompleter, который поддерживает автодополнение идентификаторов Python в интерактивном приглашении. Настройки, сделанные с помощью этого модуля, влияют на поведение как интерактивного приглашения интерпретатора, так и приглашений, предлагаемых встроенной функцией input().
Настройки сочетаний клавиш readline могут быть сконфигурированы через файл инициализации, обычно .inputrc в вашем домашнем каталоге. См. Файл инициализации Readline в руководстве GNU Readline для получения информации о формате и допустимых конструкциях этого файла, а также о возможностях библиотеки Readline в целом.
Примечание
Базовый API библиотеки Readline может быть реализован библиотекой libedit вместо GNU readline. В macOS модуль readline определяет, какая библиотека используется во время выполнения.
Файл конфигурации для libedit отличается от файла конфигурации GNU readline. Если вы программно загружаете строки конфигурации, вы можете проверить текст «libedit» в readline.__doc__ для различения GNU readline и libedit.
Если вы используете эмуляцию readline editline/libedit в 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) -
Возвращает текущее содержимое элемента истории по индексу. Индекс элемента — с единицы.
-
readline.remove_history_item(pos) -
Удалить элемент истории, указанный его позицией, из истории. Позиция — нулевая.
-
readline.replace_history_item(pos, line) -
Заменить элемент истории, указанный его позицией, на строку. Позиция — нулевая.
-
readline.add_history(line) -
Добавить строку в буфер истории, как если бы это была последняя введённая строка.
-
readline.set_auto_history(enabled) -
Включить или выключить автоматические вызовы
add_history()при чтении ввода через readline. Аргумент enabled должен быть булевым значением: при TRUE — включить автоисторию, при FALSE — выключить автоисторию.Новая в версии 3.6.
Детали реализации CPython: Автоистория включена по умолчанию и изменения не сохраняются между сеансами.
Запуск хуков
-
readline.set_startup_hook([function]) -
Установить или удалить функцию, вызываемую обратным вызовом
rl_startup_hookбазовой библиотеки. Если function указан, он будет использоваться как новая функция хука; если опущен илиNone, любая установленная функция будет удалена. Хук вызывается без аргументов непосредственно перед тем, как readline выведет первое приглашение.
-
readline.set_pre_input_hook([function]) -
Установить или удалить функцию, вызываемую обратным вызовом
rl_pre_input_hookбазовой библиотеки. Если function указан, он будет использоваться как новая функция хука; если опущен или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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/readline.html