Для языков программирования важной особенностью основного режима является
обеспечение автоматической расстановки отступов. Здесь две части: первая — определить,
какой отступ для строки является правильным, и вторая — определить, когда
следует переустанавливать отступ в строке. По умолчанию Emacs переустанавливает отступ в строке всякий раз, когда вы
вводите символ из electric-indent-chars, который по умолчанию включает
только символ новой строки. Основные режимы могут добавлять символы в electric-indent-chars
в соответствии с синтаксисом языка.
Определение правильного отступа в Emacs управляется с помощью
indent-line-function (см. Отступ, управляемый основным режимом). Для некоторых режимов
правильный отступ невозможно надежно определить, как правило, потому что
отступ значим, поэтому допустимы несколько вариантов отступа, но с разными
смыслами. В этом случае режим должен установить electric-indent-inhibit, чтобы
строка не переустанавливалась постоянно вопреки желанию пользователя.
Написание хорошей функции расстановки отступов может быть сложным, и в значительной степени это до сих пор остается искусством. Многие авторы основных режимов начинают с написания простой функции расстановки отступов, которая работает для простых случаев, например, сравнивая с отступом предыдущей текстовой строки. Для большинства языков программирования, которые не являются действительно построчными, такой подход обычно плохо масштабируется: улучшение такой функции для обработки более разнообразных ситуаций, как правило, становится все более и более трудным, что в итоге приводит к большой, сложной, неподдерживаемой функции расстановки отступов, которую никто не решается трогать.
Хорошая функция расстановки отступов обычно должна фактически анализировать текст в соответствии с синтаксисом языка. К счастью, нет необходимости анализировать текст так же подробно, как это требуется для компилятора, но, с другой стороны, анализатор, встроенный в код расстановки отступов, должен быть достаточно дружелюбен к синтаксически некорректному коду.
Хорошие поддерживаемые функции расстановки отступов обычно делятся на две категории: либо синтаксический анализ вперед от некоторой безопасной начальной точки до интересующей позиции, либо синтаксический анализ назад от интересующей позиции. Ни один из двух подходов не является явно лучшим выбором, чем другой: синтаксический анализ назад часто сложнее, чем синтаксический анализ вперед, потому что языки программирования спроектированы для синтаксического анализа вперед, но для целей расстановки отступов у него есть преимущество отсутствия необходимости угадывать безопасную начальную точку, и он обычно обладает свойством, что для определения отступа строки анализируется только минимум текста, поэтому отступ будет менее подвержен влиянию синтаксических ошибок в некотором ранее несвязанном фрагменте кода. Синтаксический анализ вперед, с другой стороны, обычно проще и имеет преимущество, позволяющее эффективно переустанавливать отступы для целой области за один раз, с одним синтаксическим анализом.
Вместо того чтобы писать свою собственную функцию расстановки отступов с нуля, часто предпочтительнее попытаться повторно использовать существующие или положиться на универсальный механизм расстановки отступов. К сожалению, таких механизмов мало. Код расстановки отступов CC-mode (используемый с C, C++, Java, Awk и некоторыми другими подобными режимами) со временем стал более универсальным, поэтому если ваш язык чем-то похож на один из этих языков, вы можете попробовать использовать этот механизм. Другой — SMIE, который использует подход в духе Lisp-овских sexp и адаптирует его для не-Lisp языков. Еще один — это полагаться на полноценный синтаксический анализатор, например, библиотеку tree-sitter.