Spec-Zone.ru › Python 3.12

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 был скомпилирован для версии библиотеки, которая её поддерживает.

END_OF_DOCUMENT_MARKER ```

Автозаполнение

Следующие функции связаны с реализацией пользовательской функции автозаполнения слов. Как правило, она активируется нажатием клавиши 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

Spec-Zone.ru

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