21.1 Введение в минибуферы

В большинстве случаев минибуфер — это обычный буфер Emacs. Большинство операций внутри буфера, таких как редактирование команд, работают нормально в минибуфере. Однако многие операции по управлению буферами не применимы к минибуферам. Название минибуфера всегда имеет вид « *Minibuf-number*’, и его нельзя изменить. Минибуферы отображаются только в специальных окнах, используемых только для минибуферов; эти окна всегда появляются внизу фрейма. (Иногда фреймы не имеют окна минибуфера, а иногда специальный тип фрейма содержит только окно минибуфера; см. Минибуферы и фреймы.)

Текст в минибуфере всегда начинается с строки подсказки, текста, указанного программой, использующей минибуфер, чтобы сообщить пользователю, какой тип ввода следует вводить. Этот текст помечен как только для чтения, чтобы вы случайно не удалили и не изменили его. Он также помечен как поле (см. Определение и использование полей), чтобы некоторые функции перемещения, включая beginning-of-line, forward-word, forward-sentence и forward-paragraph, останавливались на границе между подсказкой и фактическим текстом.

Окно минибуфера обычно представляет собой одну строку; оно автоматически увеличивается, если содержимое требует больше места. Пока минибуфер активен, вы можете временно изменить размер его окна с помощью команд изменения размера окна; окно возвращается к своему нормальному размеру, когда минибуфер закрывается. Когда минибуфер не активен, вы можете постоянно изменить его размер, используя команды изменения размера окна в другом окне фрейма или перетаскивая строку режима мышью. (Из-за деталей текущей реализации для того, чтобы это работало, resize-mini-windows должен быть nil.) Если фрейм содержит только окно минибуфера, вы можете изменить его размер, изменив размер фрейма.

Использование минибуфера считывает события ввода, и это изменяет значения переменных, таких как this-command и last-command (см. Информация из цикла команд). Ваша программа должна привязывать их вокруг кода, использующего минибуфер, если вы не хотите, чтобы они изменялись.

При определенных обстоятельствах команда может использовать минибуфер, даже если есть активный минибуфер; такой минибуфер называется рекурсивным минибуфером. Первый минибуфер называется « *Minibuf-1*’. Рекурсивные минибуферы называются путем увеличения числа в конце имени. (Имена начинаются с пробела, чтобы они не отображались в обычных списках буферов.) Из нескольких рекурсивных минибуферов самый внутренний (или самый недавно вошедший) является активным минибуфером — это тот, который вы можете завершить, нажав RET (exit-minibuffer) в нем. Обычно мы называем это минибуфером. Вы можете разрешать или запрещать рекурсивные минибуферы, устанавливая переменную enable-recursive-minibuffers или помещая свойства этого имени на символы команд (см. Рекурсивные минибуферы.)

Как и другие буферы, минибуфер использует локальную карту клавиш (см. Карты клавиш) для указания специальных привязок клавиш. Функция, вызывающая минибуфер, также настраивает его локальную карту в соответствии с задачей. См. Чтение текстовых строк из минибуфера, для локальных карт минибуфера без завершения. См. Команды минибуфера, выполняющие завершение, для локальных карт минибуфера для завершения.

Активный минибуфер обычно имеет основной режим minibuffer-mode. Это внутренний режим Emacs без каких-либо специальных функций. Чтобы настроить установку минибуферов, мы предлагаем использовать minibuffer-setup-hook (см. Разное о минибуферах), а не minibuffer-mode-hook, поскольку первый выполняется позже, после того как минибуфер полностью инициализирован.

Когда минибуфер неактивен, его основной режим — minibuffer-inactive-mode, с картой клавиш minibuffer-inactive-mode-map. Это действительно полезно, только если минибуфер находится в отдельном фрейме. См. Минибуферы и фреймы.

Когда Emacs работает в пакетном режиме, любой запрос на чтение из минибуфера на самом деле считывает строку из дескриптора стандартного ввода, который был предоставлен при запуске Emacs. Это поддерживает только базовый ввод: ни одна из специальных функций минибуфера (история, завершение и т. д.) недоступна в пакетном режиме.