42.4.1 Отображение сообщений в области эха

В этом разделе описаны стандартные функции для отображения сообщений в области эха.

Функция: message строка-формата &rest аргументы

Эта функция отображает сообщение в области эха. строка-формата — это строка формата, а аргументы — это объекты для её спецификаций формата, как в функции format-message (см. Форматирование строк). Результирующая отформатированная строка отображается в области эха; если она содержит текстовые свойства face, она отображается с указанными шрифтами (см. Шрифты). Строка также добавляется в буфер *Messages*, но без текстовых свойств (см. Журналирование сообщений в *Messages*).

Обычно обратный апостроф и апостроф в формате переводятся в соответствующие парные кавычки, например, "Missing `%s'" может дать "Missing ‘foo’". См. Стиль цитирования текста о том, как влиять на этот перевод или подавлять его.

В пакетном режиме сообщение выводится в поток стандартной ошибки, за которым следует перевод строки.

Когда inhibit-message не равен nil, сообщение не будет отображаться в области эха, а только будет записано в журнал ‘*Messages*’.

Если строка-формата равна nil или пустой строке, message очищает область эха; если область эха была расширена автоматически, это возвращает её к нормальному размеру. Если минибуфер активен, это немедленно возвращает содержимое минибуфера на экран.

(message "Reverting `%s'..." (buffer-name))
 -| Reverting ‘subr.el’...
⇒ "Reverting ‘subr.el’..."

---------- Область эха ----------
Reverting ‘subr.el’...
---------- Область эха ----------

Чтобы автоматически отображать сообщение в области эха или во всплывающем буфере в зависимости от его размера, используйте display-message-or-buffer (см. ниже).

Предупреждение: Если вы хотите использовать свою собственную строку в качестве сообщения дословно, не пишите просто (message строка). Если строка содержит ‘%’, ‘`’ или ‘'’, она может быть переформатирована с нежелательными последствиями. Вместо этого используйте (message "%s" строка).

Следующие средства позволяют пользователям и Lisp-программам управлять тем, как отображаются сообщения в области эха.

Переменная: set-message-function

Если эта переменная не равна nil, она должна быть функцией одного аргумента — текста сообщения для отображения в области эха. Эта функция будет вызываться message и связанными с ней функциями. Если функция возвращает nil, сообщение отображается в области эха как обычно. Если функция возвращает строку, эта строка отображается в области эха вместо исходного сообщения. Если функция возвращает любое другое значение, не равное nil, это означает, что сообщение уже было обработано, поэтому message не будет ничего отображать в области эха.

Значение по умолчанию вызывает set-minibuffer-message, описанное ниже.

Переменная: clear-message-function

Если эта переменная не равна nil, она должна быть функцией без аргументов; message и связанные с ней функции вызывают её, когда их аргумент сообщения равен nil или пустой строке, чтобы очистить область эха.

Обычно эта функция вызывается, когда следующее событие ввода поступает после отображения сообщения в области эха. Ожидается, что функция очистит сообщение, отображённое соответствующей функцией, указанной в set-message-function, но не обязана этого делать. Если функция хочет, чтобы область эха осталась неочищенной, она должна вернуть символ dont-clear-message; любое другое значение приведёт к очистке области эха.

Значение по умолчанию — функция, которая очищает сообщение, отображаемое в активном минибуфере.

Пользовательская опция: set-message-functions

Значение этой пользовательской опции — список функций, вызываемых для обработки отображения сообщений в области эха. Каждая функция вызывается с одним аргументом — текстом отображаемого сообщения. Если функция возвращает строку, эта строка заменяет исходное сообщение, и следующая функция в списке вызывается с новым текстом сообщения. Если функция возвращает nil, следующая функция в списке вызывается с тем же текстом; если последняя функция в списке возвращает nil, текст сообщения отображается в области эха. Если функция возвращает значение, не равное nil, но не являющееся строкой, сообщение считается обработанным, и дальнейшие функции в списке не вызываются.

Три полезные функции, которые можно поместить в список, являющийся значением этой опции, описаны ниже.

Функция: set-minibuffer-message сообщение

Эта функция отображает сообщение в области эха, когда минибуфер не активен, и в конце минибуфера, когда минибуфер активен. Однако если текст, отображаемый в активном минибуфере, имеет текстовое свойство minibuffer-message (см. Свойства со специальными значениями) на каком-либо символе, сообщение будет отображаться перед первым символом, имеющим это свойство.

Эта функция по умолчанию является единственным членом списка в set-message-functions.

Функция: inhibit-message сообщение

Если сообщение в области эха совпадает с любым регулярным выражением в списке, являющемся значением пользовательской опции inhibit-message-regexps, эта функция подавляет отображение этого сообщения и возвращает значение, не равное nil и не являющееся строкой. Таким образом, если эта функция находится в списке set-message-functions, остальные функции в списке не будут вызываться, когда сообщение совпадает с регулярными выражениями в inhibit-message-regexps. Чтобы гарантировать, что совпадающее сообщение никогда не будет отображено, сделайте эту функцию первым элементом списка в set-message-functions.

Функция: set-multi-message сообщение

Эта функция накапливает несколько сообщений в области эха, выводимых одно за другим, и возвращает их как одну строку, в которой отдельные сообщения разделены переводами строк. Может быть накоплено до multi-message-max последних сообщений. Накопленные сообщения отбрасываются, если с момента вывода первого сообщения прошло более multi-message-timeout секунд.

Переменная: inhibit-message

Когда эта переменная не равна nil, message и связанные с ней функции не будут отображать никаких сообщений в области эха. Сообщения в области эха по-прежнему записываются в буфер *Messages*.

Макрос: with-temp-message сообщение &rest тело

Эта конструкция временно отображает сообщение в области эха во время выполнения тела. Она отображает сообщение, выполняет тело, затем возвращает значение последней формы в теле, восстанавливая предыдущее содержимое области эха.

Функция: message-or-box строка-формата &rest аргументы

Эта функция отображает сообщение, как message, но может отображать его в диалоговом окне вместо области эха. Если эта функция вызывается в команде, которая была вызвана с помощью мыши — точнее, если last-nonmenu-event (см. Информация из командного цикла) равно nil или списку — то она использует диалоговое окно или всплывающее меню для отображения сообщения. В противном случае она использует область эха. (Это тот же критерий, который y-or-n-p использует для принятия аналогичного решения; см. Запросы "Да или нет".)

Вы можете принудительно использовать мышь или область эха, привязав last-nonmenu-event к подходящему значению вокруг вызова.

Функция: message-box строка-формата &rest аргументы

Эта функция отображает сообщение, как message, но использует диалоговое окно (или всплывающее меню) всегда, когда это возможно. Если невозможно использовать диалоговое окно или всплывающее меню, потому что терминал не поддерживает их, то message-box использует область эха, как message.

Функция: display-message-or-buffer сообщение &optional имя-буфера действие фрейм

Эта функция отображает сообщение, которое может быть либо строкой, либо буфером. Если оно короче максимальной высоты области эха, определяемой max-mini-window-height, оно отображается в области эха с помощью message. В противном случае для его отображения во всплывающем буфере используется display-buffer.

Возвращает либо строку, показанную в области эха, либо, когда используется всплывающий буфер, окно, использованное для его отображения.

Если сообщение — это строка, то необязательный аргумент имя-буфера — это имя буфера, используемого для его отображения, когда используется всплывающий буфер; по умолчанию *Message*. В случае, когда сообщение является строкой и отображается в области эха, не определено, будут ли содержимое вставлено в буфер в любом случае.

Необязательные аргументы действие и фрейм такие же, как для display-buffer, и используются только в случае отображения буфера.

Функция: current-message

Эта функция возвращает сообщение, которое в данный момент отображается в области эха, или nil, если ничего не отображается.