24.4.2 Структура данных строки режима

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

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

Ниже приведены значения различных типов данных как конструктов строки режима:

string

Строка как конструкт строки режима отображается дословно, за исключением %-конструктов в ней. Они обозначают подстановку других данных; см. %-Конструкты в строке режима.

Если части строки имеют свойства face, они контролируют отображение текста так же, как и текст в буфере. Любые символы, не имеющие свойств face, по умолчанию отображаются в face mode-line или mode-line-inactive (см. Стандартные face в Руководство GNU Emacs). Свойства help-echo и keymap в string имеют особое значение. См. Свойства в строке режима.

symbol

Символ как конструкт строки режима обозначает его значение. Значение symbol используется как конструкт строки режима вместо symbol. Однако символы t и nil игнорируются, как и любой символ, значение которого пусто.

Есть одно исключение: если значение symbol является строкой, оно отображается дословно: %-конструкты не распознаются.

Если symbol не помечен как рискованный (т.е. у него нет не-nil свойства risky-local-variable), все текстовые свойства, указанные в значении symbol, игнорируются. Это включает текстовые свойства строк в значении symbol, а также все формы :eval и :propertize в нем. (Причина этого — безопасность: нерискованные переменные могут быть установлены автоматически из переменных файла без запроса у пользователя.)

(string rest…)
(list rest…)

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

(:eval form)

Список, чей первый элемент — символ :eval, означает вычислить form и использовать результат в качестве строки для отображения. Убедитесь, что это вычисление не загружает файлы и не вызывает такие функции, как posn-at-point или window-in-direction, поскольку они сами вычисляют строку режима, что может вызвать бесконечную рекурсию.

(:propertize elt props…)

Список, чей первый элемент — символ :propertize, означает рекурсивную обработку конструкта строки режима elt, затем добавление текстовых свойств, указанных в props, к результату. Аргумент props должен состоять из нуля или более пар text-property value. Если elt является строкой или порождает строку с текстовыми свойствами, все символы этой строки должны иметь одинаковые свойства, иначе некоторые из них могут быть удалены :propertize.

(symbol then else)

Список, чей первый элемент — символ, не являющийся ключевым словом, определяет условное выражение. Его значение зависит от значения symbol. Если symbol имеет не-nil значение, рекурсивно обрабатывается второй элемент, then, как конструкт строки режима. В противном случае рекурсивно обрабатывается третий элемент, else. Вы можете опустить else; тогда конструкт строки режима не отображает ничего, если значение symbol равно nil или пусто.

(width rest…)

Список, чей первый элемент — целое число, указывает на усечение или дополнение результатов rest. Оставшиеся элементы rest обрабатываются рекурсивно как конструкты строки режима и конкатенируются. Когда width положительно, результат дополняется пробелами справа, если его ширина меньше, чем width. Когда width отрицательно, результат усекается справа до −width столбцов, если его ширина превышает −width.

Например, обычный способ показать, какой процент буфера находится выше верха окна, — использовать такой список: (-3 "%p").