Содержимое каждой строки режима определяется буферо-локальной переменной
mode-line-format (см. Высший уровень управления строкой режима). Эта
переменная содержит конструкцию строки режима: шаблон, который
контролирует отображение в строке режима буфера. Значение
header-line-format и tab-line-format
определяет строку заголовка и строку вкладок буфера аналогичным образом. Все
окна для одного и того же буфера используют одну и ту же
mode-line-format, header-line-format и
tab-line-format, если только не указан параметр
mode-line-format, header-line-format или
tab-line-format для этого окна (см. Параметры окна).
Для повышения эффективности Emacs не пересчитывает строку режима и
строку заголовка каждого окна непрерывно. Он делает это, когда обстоятельства
похоже на то, что требуют этого — например, если вы меняете конфигурацию
окна, переключаете буфер, сужаете или расширяете буфер, прокручиваете или
изменяете буфер. Если вы изменяете любую из переменных, на которые ссылается
mode-line-format или header-line-format (см.
Переменные, используемые в строке режима),
или любые другие структуры данных, влияющие на отображение текста (см.
Отображение Emacs), вы должны использовать
функцию force-mode-line-update для обновления отображения.
Эта функция принудительно заставляет Emacs обновить строку режима и
строку заголовка текущего буфера на основе последних значений всех
соответствующих переменных во время следующего цикла повторного отображения.
Если необязательный аргумент all не равен
nil, она принудительно обновляет все строки режима и
строки заголовка.
Эта функция также принудительно обновляет панель меню и заголовок рамки.
Строка режима выбранного окна обычно отображается в другом цвете с
использованием фейса mode-line-active. Строки режима
других окон отображаются вместо этого в фейсе mode-line-inactive.
См. Фейсы.
Если вы хотите иметь более существенные различия между строками
режима в выбранных и невыбранных окнах, вы можете использовать этот
предикат в конструкции :eval. Например, если вы хотите
отображать имя буфера жирным шрифтом в выбранных окнах, но курсивом в
других окнах, вы можете написать что-то вроде:
(setq-default mode-line-buffer-identification '(:eval (propertize "%12b" 'face (if (mode-line-window-selected-p) 'bold 'italic))))
Некоторые режимы помещают много данных в строку режима, выталкивая
элементы в конце строки режима вправо. Emacs может «сжать» строку режима,
если переменная mode-line-compact не равна nil,
превращая участки пробелов в один пробел. Если эта переменная
long, это делается только тогда, когда строка режима шире
текущего выбранного окна. (Этот расчет приблизительный, основанный на
количестве символов, а не на их отображаемой ширине.) Эта переменная
может быть буферо-локальной, чтобы сжимать строки режима только в
определенных буферах.