33.17.2 Отступ, контролируемый основным режимом

Важной функцией каждого основного режима является настройка клавиши TAB для правильного отступа языка, который редактируется. В этом разделе описывается механизм клавиши TAB и то, как его контролировать. Функции в этом разделе возвращают непредсказуемые значения.

Команда: indent-for-tab-command &optional rigid

Это команда, привязанная к TAB в большинстве режимов редактирования. Ее обычное действие — отступить текущую строку, но она также может вставить символ табуляции или отступить регион.

Вот что она делает:

  • Сначала она проверяет, включен ли режим Transient Mark и активен ли регион. Если да, она вызывает indent-region для отступа всего текста в регионе (см. Отступ целого региона).
  • В противном случае, если функция отступа в indent-line-function равна indent-to-left-margin (тривиальная команда, которая вставляет символ табуляции), или если переменная tab-always-indent указывает, что должен быть вставлен символ табуляции (см. ниже), то она вставляет символ табуляции.
  • В противном случае она отступает текущую строку; это делается вызовом функции в indent-line-function. Если строка уже отступлена, и значение tab-always-indent равно complete (см. ниже), она пытается завершить текст в точке.

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

Переменная: indent-line-function

Значение этой переменной — это функция, которую indent-for-tab-command и различные другие команды отступа используют для отступа текущей строки. Обычно она присваивается основным режимом; например, в режиме Lisp она устанавливает ее в lisp-indent-line, в режиме C она устанавливает ее в c-indent-line и так далее. Значение по умолчанию — indent-relative. См. Автоматический отступ кода.

Команда: indent-according-to-mode

Эта команда вызывает функцию в indent-line-function для отступа текущей строки способом, соответствующим текущему основному режиму.

Команда: newline-and-indent

Эта функция вставляет новую строку, а затем отступает новую строку (ту, которая следует за только что вставленной новой строкой) в соответствии с основным режимом. Она выполняет отступ, вызывая indent-according-to-mode.

Команда: reindent-then-newline-and-indent

Эта команда переотступает текущую строку, вставляет новую строку в точке, а затем отступает новую строку (ту, которая следует за только что вставленной новой строкой). Она выполняет отступ для обеих строк, вызывая indent-according-to-mode.

Пользовательский вариант: tab-always-indent

Эту переменную можно использовать для настройки поведения команды TAB (indent-for-tab-command). Если значение равно t (по умолчанию), команда обычно просто отступает текущую строку. Если значение равно nil, команда отступает текущую строку только в том случае, если точка находится на левом поле или в отступе строки; в противном случае она вставляет символ табуляции. Если значение равно complete, команда сначала пытается отступить текущую строку, а если строка уже была отступлена, она вызывает completion-at-point для завершения текста в точке (см. Завершение в обычных буферах).

Пользовательский вариант: tab-first-completion

Если tab-always-indent равно complete, можно дополнительно настроить, следует ли расширять или отступать с помощью переменной tab-first-completion. Могут использоваться следующие значения:

eol

Завершать только в том случае, если точка находится в конце строки.

word

Завершать, если следующий символ не имеет синтаксиса слова.

word-or-paren

Завершать, если следующий символ не имеет синтаксиса слова или не является скобкой.

word-or-paren-or-punct

Завершать, если следующий символ не имеет синтаксиса слова, или не является скобкой, или не является пунктуацией.

В любом случае, повторное нажатие TAB всегда приводит к завершению.

Некоторые основные режимы должны поддерживать встроенные регионы текста, синтаксис которых принадлежит другому основному режиму. Примеры включают исходные файлы литературного программирования, которые объединяют документацию и фрагменты исходного кода, программы Yacc/Bison, включающие фрагменты кода на Python или JS и т. д. Чтобы правильно отступить встроенные части, основной режим должен делегировать отступ другому движку отступа другого режима (например, вызывать js-indent-line для кода JS или python-indent-line для Python), предоставляя ему некоторый контекст для управления отступом. Основные режимы, в свою чарен, должны избегать вызова widen в своем коде отступа и соблюдать prog-first-column.

Переменная: prog-indentation-context

Эта переменная, если она не равна nil, содержит контекст отступа для движка отступа подрежима, предоставленного вышестоящим основным режимом. Значение должно быть списком вида (first-column . rest. Члены списка имеют следующее значение:

first-column

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

rest

Это значение в настоящее время не используется.

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

Функция: prog-first-column

Вызывайте эту функцию вместо использования буквального значения (обычно ноль) номера столбца для отступа конструкций программы верхнего уровня. Значение функции — это номер столбца, который следует использовать для конструкций верхнего уровня. Когда не действует вышестоящий режим, эта функция возвращает ноль.