Автоматические отступы в коде
Для языков программирования важной особенностью основного режима является автоматическая расстановка отступов. Она состоит из двух частей: нужно определить правильный отступ строки, а также решить, когда следует изменить отступ строки. По умолчанию Emacs меняет отступ строки при вводе символа из electric-indent-chars, который по умолчанию включает только символ новой строки. Основные режимы могут добавлять символы в electric-indent-chars в соответствии с синтаксисом языка.
В Emacs определение правильного отступа управляется с помощью indent-line-function (см. Отступы, управляемые основным режимом). В некоторых режимах невозможно надежно определить правильный отступ, обычно потому, что отступ имеет значение: допустимы несколько вариантов с разным смыслом. В таком случае режиму следует установить electric-indent-inhibit, чтобы строка не меняла отступ постоянно вопреки желанию пользователя.
Написать хорошую функцию расстановки отступов бывает непросто; во многом это по-прежнему своего рода искусство. Многие авторы основных режимов начинают с простой функции, которая работает в простых случаях, например сравнивает отступ с отступом предыдущей строки текста. Для большинства языков программирования, которые не являются по-настоящему построчными, такой подход плохо масштабируется: усовершенствовать функцию, чтобы она обрабатывала более разнообразные ситуации, становится все сложнее, и в итоге получается большая, сложная и неподдерживаемая функция расстановки отступов, к которой никто не осмеливается притронуться.
Хорошей функции расстановки отступов обычно требуется анализировать текст в соответствии с синтаксисом языка. К счастью, нет необходимости анализировать текст так же подробно, как это требуется компилятору. С другой стороны, парсер, встроенный в код расстановки отступов, должен достаточно корректно работать с синтаксически неверным кодом.
Хорошие и удобные в сопровождении функции расстановки отступов обычно относятся к одной из двух категорий: они либо анализируют текст вперед от некоторой безопасной начальной позиции до нужной позиции, либо анализируют его назад от нужной позиции. Ни один из этих подходов нельзя однозначно назвать лучшим: обратный анализ часто сложнее прямого, поскольку языки программирования разрабатываются с расчетом на прямой анализ. Однако для расстановки отступов у него есть преимущество: не нужно угадывать безопасную начальную позицию. Кроме того, как правило, для определения отступа строки анализируется лишь минимальный объем текста, поэтому на расстановку отступов меньше влияют синтаксические ошибки в более ранних, не связанных с ней фрагментах кода. Прямой анализ, напротив, обычно проще и позволяет эффективно менять отступы во всей области за один раз, выполняя анализ всего один раз.
Вместо того чтобы писать собственную функцию расстановки отступов с нуля, часто лучше попробовать использовать уже существующие функции или универсальный механизм расстановки отступов. К сожалению, таких механизмов немного. Код расстановки отступов в CC-mode (используемый в режимах для C, C++, Java, Awk и некоторых других языков) с годами стал более универсальным. Поэтому, если ваш язык в чем-то похож на один из этих языков, попробуйте использовать этот механизм. Другой вариант — SMIE, который использует подход, основанный на s-выражениях Lisp, и адаптирует его для языков, не относящихся к Lisp. Еще один вариант — использовать полноценный парсер, например библиотеку tree-sitter.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Auto_002dIndentation.html