24.4.1 Основы строки режима

Содержимое каждой строки режима определяется буферо-локальной переменной 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 для обновления отображения.

Функция: force-mode-line-update &optional all

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

Эта функция также принудительно обновляет панель меню и заголовок рамки.

Строка режима выбранного окна обычно отображается в другом цвете с использованием фейса mode-line-active. Строки режима других окон отображаются вместо этого в фейсе mode-line-inactive. См. Фейсы.

Функция: mode-line-window-selected-p

Если вы хотите иметь более существенные различия между строками режима в выбранных и невыбранных окнах, вы можете использовать этот предикат в конструкции :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, это делается только тогда, когда строка режима шире текущего выбранного окна. (Этот расчет приблизительный, основанный на количестве символов, а не на их отображаемой ширине.) Эта переменная может быть буферо-локальной, чтобы сжимать строки режима только в определенных буферах.