Редактирование программ – ЧАСТЬ 4

Значение каждого сдвига в 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

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий