Значение каждого сдвига в c-offsets-alist может быть целым числом, именем функции или переменной, списком или одним их символов +, -, ++, –, * или /, обозначающих положительные или отрицательные кратные переменной c-basic-offset. Таким образом, если вы хотите поменять уровни отступов с трех пробелов на два пробела, установите c-basic-offset в значение 3.
Использование функции в качестве значения сдвига предоставляет полную гибкость в настройке отступов. Эта функция вызывается с одним аргументом, содержащим пару из синтаксического символа и позиции в буфере, если она есть. Функция должна возвращать целое число, равное сдвигу.
Если значением сдвига является список, его элементы обрабатываются в соответствии с описанными выше правилами, пока не найдено отличное от nil значение. Тогда это значение добавляется к общему отступу обычным способом. Основное применение этого состоит в сложении результатов нескольких функций.
Команда C-c C-o (c-set-offset) — это простейший способ установить сдвиги, как интерактивно, так и в вашем файле ‘~/.emacs’. Сначала укажите синтаксический символ, а потом желаемый сдвиг. См. Раздел 22.5.5.4 [Синтаксические символы], с. 214, перечень допустимых синтаксических символов и их значений.
22.5.5.4 Синтаксические символы
Это таблица допустимых синтаксических символов для отступов режима C и родственных с ним режимов и их синтаксические значения. Обычно всем этим символам приписывается сдвиг в c-offsets-alist.
string Внутри строки, занимащей несколько строк в буфере.
c Внутри многострочного блочного комментария в стиле Си.
defun-open
На фигурной скобке, которая открывает определение функции.
defun-close
На фигурной скобке, которая закрывает определение функции.
defun-block-intro
На первой строке определения функции верхнего уровня.
class-open
На фигурной скобке, которая открывает определение класса.
class-close
На фигурной скобке, которая закрывает определение класса.
inline-open
На фигурной скобке, которая открывает определяемый внутри класса inline-
метод.
inline-close
На фигурной скобке, которая закрывает определяемый внутри класса inline-
метод.
extern-lang-open
На фигурной скобке, которая открывает блок на внешнем языке.
extern-lang-close
На фигурной скобке, которая закрывает блок на внешнем языке.
func-decl-cont
На области между списком аргументов в определении функции и открывающей это определение фигурной скобкой (исключая определения функций в стиле K&R). В Си вы не можете писать здесь ничего, кроме пробельных знаков и комментариев; в Си++ и Java в этом контекте могут появляться объявления throws и другие вещи.
knr-argdecl-intro
На первой строке объявления аргументов в стиле K&R Си.
knr-argdecl
На одной из последующих строк объявления аргументов в стиле K&R Си.
topmost-intro
На первой строке определения конструкции самого верхнего уровня.
topmost-intro-cont
На остальных строках определения самого верхнего уровня.
member-init-intro
На первой строке списка инициализаций членов.
member-init-cont
На последующих строках списка инициализаций членов.
inher-intro
На первой строке списка множественного наследования.
inher-cont
block-open
На одной их последующих строк множественного наследования.
На открывающей фигурной скобке операторного блока.
block-close
На закрывающей фигурной скобке операторного блока.
brace-list-open
На открывающей фигурной скобке списка массива enum или static.
brace-list-close
На закрывающей фигурной скобке списка массива enum или static.
brace-list-intro
На первой строке списка массива enum или static.
brace-list-entry
На одной их последующих строк списка массива enum или static.
brace-entry-open
На одной из последующих строк списка массива enum или static, когда строка начинается с открывающей фигурной скобки.
statement
На обычном операторе.
statement-cont
На строке продолжения оператора.
statement-block-intro
На первой строке нового операторного блока.
statement-case-intro
На первой строке “блока” case.
statement-case-open
На первой строке блока case, начинающейся с фигурной скобки.
inexpr-statement
На операторном блоке внутри выражения. Это используется для расширения GNU в языке Си и для для специальных функций Pike, которые принимают в качестве аргумента операторный блок.
inexpr-class
На определении класса внутри выражения. Это используется для аноноимных классов и аноноимных инициализаторов массивов в Java.
substatement
На первой строке после if, while, for, do или else.
substatement-open
На фигурной скобке, открывающей блок подоператора.
case-label
На метке case или default.
access-label
На метках доступа Си++ private, protected или public.
label На обычной метке.
do-while-closure
На while, который завершает конструкцию do-while.
else-clause
На else конструкции if-else.
catch-clause
На строках catch и finally в конструкциях try. . . catch в Си++ и Java.
comment-intro
На строке, содержащей только начало комментария.
arglist-intro
На первой строке списка аргументов.
arglist-cont
На одной из последующих строк списка аргументов, когда на строке с откры-
вающей список аргументов круглой скобкой нет ни одного аргумента.
arglist-cont-nonempty
На одной из последующих строк списка аргументов, когда на строке с откры-
вающей список аргументов круглой скобкой есть хотя бы один аргумент.
arglist-close
На закрывающей круглой скобке списка аргументов.
stream-op
На одной строк продолжения конструкции потокового оператора.
inclass На конструкции, вложенной в определение класса. Отступ относителен откры-
вающей фигурной скобке определения класса.
inextern-lang
На конструкции, вложенной в блок на внешнем языке.
inexpr-statement
На первой строке операторного блока внутри выражения. Это нужно для расширения GCC в языке Си, которое использует синтаксис ({ … }). Это также нужно для специальных функций в Pike, принимающих в качестве аргумента операторный блок.
inexpr-class
На первой строке определения класса внутри выражения. Это используется для аноноимных классов и аноноимных инициализаторов массивов в Java.
cpp-macro
На начале макроса препроцессора.
friend На объявлении Си++ friend.
objc-method-intro
На первой строке определения метода Objective-C.
objc-method-args-cont
На одной из строк продолжения определения метода Objective-C.
objc-method-call-cont
На одной из строк продолжения вызова метода Objective-C.
inlambda Как inclass, но применяется внутри лямбда-функций (т.е. анонимных). Ис-
пользуется только в Pike.
lambda-intro-cont
На строке, продолжающей заголовок лямбда-функции, между ключевым словом
lambda и телом функции. Используется только в Pike.
22.5.5.5 Переменные, управляющие отступами в Си
Этот раздел описывает дополнительные переменные, которые управляют поведением отступов в режиме C и родственных с ним режимах.
c-offsets-alist
Ассоциативный список синтаксических символов и их сдвигов. Вы не должны менять его прямо, делайте это через c-set-offset. См. Раздел 22.5.5.3 [Изменение стиля отступов], с. 213, для подробностей.
c-style-alist
Переменная для определения стилей отступов; смотрите ниже.
c-basic-offset
Базовый сдвиг, используемый символами + и в c-offsets-alist.
c-special-indent-hook
Ловушка для специальных подстроек отступов, определяемых пользователем. Эта ловушка вызывается после того, как в строке уже сделан отступ режимом C или родственным с ним режимом.
Переменная c-style-alist задает предопределенные стили отступов. Каждый элемент имеет форму (имя установка–переменной…), где имя — это имя стиля. Каждая установка–переменной имеет форму (переменная . значение); переменная — это одна из настроечных переменных, используемых режимом C, а значение — это значение для этой переменной, когда используется выбранный стиль.
Когда переменная равна c-offsets-alist, это особый случай: значение добавляется в начало значения c-offsets-alist, а не замещает его. Следовательно, значение не обязано указывать каждый синтаксический символ — можно написать только те, для которых стиль отличен от принимаемого по умолчанию.
Отступы строк, содержащих только комментарии, также подвержены влиянию пере-
менной c-comment-only-line-offset (см. Раздел 22.15.5 [Комментарии в Си], с. 239).
22.5.5.6 Стили отступов в Си
Стиль Си — это набор настроек стиля отступов. Emacs поставляется с несколькими предопределенными стилями отступов для C и родственных режимов, включая gnu, k&r, bsd, stroustrup, linux, python, java, whitesmith, ellemtel и cc-mode. По умолчанию применяется стиль gnu.
Чтобы выбрать нужный вам стиль, используйте команду M-x c-set-style. Задавайте имя стиля в качестве аргумента (регистр не имеет значения). Выбранный стиль применяется только к новым буферам, но не к тем, что вы уже редактируете. Вы также можете установить переменную c-default-style, чтобы указать стиль для различных основных режимов. Ее значением должен быть ассоциативный список, где каждый элемент задает один основной режим и стиль отступов, который для него нужно использовать. Например,
(setq c-default-style
’((java-mode . "java") (other . "gnu")))
определяет явный выбор для режима Java и велит принимать стиль ‘gnu’ по умолчанию для остальных C-подобных режимов.
Чтобы определить новый стиль отступов в Си, вызовите функцию c-add-style:
(c-add-style имя значения применить–сразу)
Здесь имя — это имя нового стиля (строка), а значения — это ассоциативный список, чьи элементы имеют форму (переменная . значение). Задаваемые вами переменные должны быть среди описанных в этом руководстве (см. Раздел 22.5.5.5 [Переменные для отступов в Си], с. 217).
Если применить–сразу не равна nil, c-add-style переключает в новый стиль сразу после его определения.
22.6 Автоматическое отображение парных скобок
Способность Emacs находить парные скобки предназначается для того, чтобы автоматически показывать, как скобки в тексте соответствуют друг другу. Всякий раз, когда вы набираете самовставляющийся знак, который является закрывающим ограничителем, курсор на мгновение передвигается в положение соответствующего открывающего ограничителя, при условии, что он находится на экране. Если его нет на экране, то в эхо-области показывается немного текста, начинающегося с открывающего ограничителя. В любом случае вы можете сказать, какая группа закрывается.
В Лиспе автоматическое соответствие применяется только к круглым скобкам. В Си оно применяется также к фигурным и квадратным скобкам. Emacs узнает, какие знаки рассматривать как парные ограничители, основываясь на синтаксической таблице, которая устанавливается основным режимом. См. Раздел 31.6 [Синтаксис], с. 366.
Источник: Ричард Столмен, Руководство по GNU Emacs

April 25th, 2012
admin
Опубликовано в рубрике
Метки: