Spec-Zone.ru › Python 3.7

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)

Удаляет элемент истории, заданный его позицией, из истории. Позиция нулевая. Это вызов 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 базовой библиотеки. Если 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])

Устанавливает или удаляет функцию отображения автодополнения. Если функция указана, она будет использоваться как новая функция отображения автодополнения; если она опущена или 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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/readline.html

Spec-Zone.ru

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