Spec-Zone.ru › Python 3.8

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.

Если вы используете эмуляцию 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)

Возвращает текущее содержимое элемента истории по индексу index. Индекс элемента — один основанный.

Это вызывает history_get() в базовой библиотеке.

readline.remove_history_item(pos)

Удалить элемент истории, указанный его позицией из истории. Позиция нулевая.

Это вызывает remove_history() в базовой библиотеке.

readline.replace_history_item(pos, line)

Заменить элемент истории, указанный его позицией, на line. Позиция нулевая.

Это вызывает replace_history_entry() в базовой библиотеке.

readline.add_history(line)

Добавить 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 базовой библиотеки. Если 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 библиотеки.

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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/readline.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API