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