Spec-Zone.ru › Elisp

Указание правил отступа

На основе предоставленной грамматики SMIE сможет автоматически обеспечивать отступы без дополнительных усилий. Но на практике этот стиль отступа по умолчанию, вероятно, будет недостаточно хорошим. Вам потребуется его настроить во многих случаях.

Отступы SMIE основаны на идее, что правила отступа должны быть максимально локальными. С этой целью он опирается на понятие виртуального отступа, который представляет собой отступ, который имела бы конкретная точка программы, если бы она находилась в начале строки. Конечно, если эта точка программы действительно находится в начале строки, ее виртуальный отступ совпадает с текущим отступом. Но если нет, то SMIE использует алгоритм отступа для вычисления виртуального отступа этой точки. На практике виртуальный отступ точки программы не обязательно должен совпадать с отступом, который она бы имела, если бы мы вставили перенос строки перед ней. Чтобы увидеть, как это работает, правило SMIE для отступа после { в C не учитывает, находится ли { на собственной строке или в конце предыдущей строки. Вместо этого эти разные случаи обрабатываются в правиле отступа, которое определяет, как отступать перед {.

Еще одним важным понятием является понятие родителя: родитель токена — это ведущий токен ближайшего содержащего синтаксического конструкта. Например, родителем else является if, к которому он относится, а родителем if, в свою очередь, является ведущий токен окружающего конструкта. Команда backward-sexp переходит от токена к его родителю, но есть некоторые оговорки: для открывателей (токенов, которые начинают конструкт, например, if) нужно начинать с точки перед токеном, а для других — с точки после токена. backward-sexp заканчивается точкой перед родительским токеном, если это открыватели токена, который нас интересует, а в противном случае — точкой после родительского токена.

Правила отступа SMIE задаются с помощью функции, которая принимает два аргумента method и arg, где значение arg и ожидаемое возвращаемое значение зависят от method.

method может быть:

  • :after, в этом случае arg — это токен, и функция должна вернуть offset, используемый для отступа после arg.
  • :before, в этом случае arg — это токен, и функция должна вернуть offset, используемый для отступа arg самого.
  • :elem, в этом случае функция должна вернуть либо отступ для отступа аргументов функции (если arg — символ arg), либо базовый шаг отступа (если arg — символ basic).
  • :list-intro, в этом случае arg — это токен, и функция должна вернуть не-nil, если за токеном следует список выражений (не разделенных никаким токеном), а не выражение.

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

offset может быть:

  • nil: использовать правило отступа по умолчанию.
  • (column . column): отступать до столбца column.
  • number: сместить на number, относительно базового токена, который является текущим токеном для :after и его родителем для :before.

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/SMIE-Indentation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API