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

Если команды Emerge были вызваны из другой программы на Лиспе, то в случае успешного завершения возвращается значение t, а если вы прервали объединение, возвращается nil.

22.14.6  Комбинирование двух  версий

Иногда вы хотите сохранить оба варианта некоторого изменения.  Чтобы сделать так,

используйте x c, которая редактирует буфер объединения следующим  образом:

#ifdef NEW

версия из буфера A

#else  /* not  NEW  */

версия из буфера B

#endif /*  not  NEW  */

Хотя этот пример показывает условные конструкции препроцессора Си, разделяющие два альтернативные версии, вы можете задать используемые строки, устанавливая переменную emerge-combine-versions-template по вашему выбору. В этой строке ‘%a’ говорит, где нужно помещать версию A, а ‘%b’ говорит, говорит помещать версию B. Установка по умолчанию, которая выдает результат, показанный выше, выглядит следующим так:

"#ifdef NEW\n%a#else  /* not  NEW  */\n%b#endif  /* not  NEW  */\n"

22.14.7  Тонкие вопросы, связанные  с Emerge

В процессе объединения  вы не должны пытаться редактировать буферы A и B сами. Emerge временно изменяет их, но в конце возвращает в исходное состояние.

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

Запуск Emerge может занять продолжительное время, поскольку ей требуется полностью сравнить файлы. Emacs не можете  ничего делать, пока diff не завершится. Возможно, в будущем кто-то изменит Emerge так, что она будет делать сравнение в фоновом режиме, когда входные файлы велики — тогда вы могли бы продолжать в Emacs другие дела, пока Emerge действительно  не будет готова принимать команды.

После подготовки объединения  Emerge запускает ловушку emerge-startup-hook (см.

Раздел 31.2.3 [Ловушки], с. 349).

22.15  Режим C и родственные с ним

Этот  раздел описывает особые  средства, доступные в режимах C, C++, Objective-C, Java, CORBA IDL и Pike. Когда мы говорим “режим C и родственные с ним”, мы имеем в виду эти режимы.

22.15.1  Команды перемещения  в режиме  C

Этот раздел описывает команды для перемещения точки в режиме C и родственных с ним режимах.

C-c C-u      Перемещает точку назад к содержащей  ее условной  констукции препроцессора, оставляя метку в текущей позиции. Префиксный аргумент работает в качестве счетчика повторов. С отрицательным аргументом,  перемещает точку  вперед к концу этой условной констукции препроцессора.   При проходе назад, #elif рассматривается как #else,  за которой стоит #if.  При проходе вперед #elif игнорируется.

C-c C-p      Перемещает точку назад через условную констукцию препроцессора, оставляя метку в текущей позиции. Префиксный аргумент служит в качестве счетчика повторов. С отрицательным аргументом, перемещает вперед.

C-c C-n      Перемещает точку вперед через условную констукцию препроцессора, оставляя метку в текущей позиции. Префиксный аргумент служит в качестве счетчика повторов. С отрицательным аргументом, перемещает назад.

M-a            Перемещает точку  к началу самого внутреннего оперетора Си (c-beginningof-statement).  Если точка уже находится в начале оператора,  перемещает к началу предыдущего. С префиксным аргументом n, перемещает назад на n ?

1 операторов.

Если точка находится внутри строки или комментария или после комментария (между ними только пропуск), эта команда перемещает по предложениям, а не по операторам.

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

M-e            Перемещает точку к концу самого внутреннего оперетора Си; как M-a, но пере-

мещает в противоположном направлении (c-end-of-statement).

M-x c-backward-into-nomenclature

Перемещает точку  назад к началу секции или слова в нотации Си++. С префиксным аргументом n, перемещает n раз. Если n отрицательно, перемещает вперед. Нотация Си++ обозначает запись имен символов в стиле ИменованиеСимволовВСмешанномРегистреИБезПодчерков;  каждая заглавная буква начинает секцию или слово.

В проекте GNU мы рекомендуем использовать для разделения слов в иденти-

фикаторах Си или Си++ подчерки, а не изменение регистра.

M-x c-forward-into-nomenclature

Перемещает точку назад к концу секции или слова в нотации Си++. С префикс-

ным аргументом n, перемещает n раз.

22.15.2  Электрикзнаки в Си

В режиме Си и родственных с ним некоторые печатные знаки являются “электрическими” — помимо вставки самих себя, они также обновляют отступ в текущей строке и могут вставлять переводы строк. Это средство управляется  переменной c-auto-newline. “Электрик”-знаки — это {, }, :, #, ;, ,, <, >, /, *, ( и ).

Электрик-знаки вставляют переводы строк, только если включено средство auto-newline (это отображается в строке режима как ‘/a’  после имени режима). Это средство управляется переменной c-auto-newline. Вы можете включить или выключить его командой C-c C-a:

C-c C-a      Перекючает автоматическую вставку переводов строк (c-toggle-auto-state).

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

Двоеточие — это электрик-знак, поскольку это подходит для одного двоеточия.  Но это неудобно, когда вы хотите вставить двойное двоеточие в Си++. Вы можете вставить двойное двоеточие в Си++ без вставки отступа или перевода строки, набирая C-c :.

C-c :     Вставляет в точке оператор области видимости, двойное двоеточие, не изменяя отступ строки и не добавляя новых строк (c-scope-operator).

Электрик-ключ  #  обновляет отступ  строки,  если он  оказался в  начале  директи-

вы препроцессора. Это происходит, когда значение c-electric-pound-behavior равно

(alignleft).  Вы можете выключить эту возможность, устанавливая c-electric-poundbehavior  в nil.

Переменная c-hanging-braces-alist управляет вставкой переводов строк до и после вставленных фигурных скобок. Это ассоциативный список с элементами в такой форме: (синтаксическийсимвол . списокпс).   Большинство синтаксических символов, перечисленных в c-offsets-alist, имеют смысл и здесь.

Список списокпс может содержать один из символов before  и after, либо оба, или это может быть nil.  Когда вставляется фигурная скобка, в c-hanging-braces-alist ищется определяемый ей синтаксический контекст;  если он найден, используется списокпс для выяснения того, где нужно вставить перевод строки:  перед фигурной  скобкой, после нее или и до, и после.  Если ничего не найдено, по умолчанию вставляет перевод строки до и после фигурных скобок.

Переменная  c-hanging-colons-alist управляет вставкой переводов  строк  до и  после  вставленных двоеточий.   Это  ассоциативный список, чьи элементы имеют форму (синтаксическийсимвол . списокпс).  Список списокпс может содержать любые из символов before  или after, либо оба, или это может быть nil.

Когда вставляется двоеточие, в этом cписке ищется определяемый им синтаксический символ, и если он найден, используется списокпс для выяснения того, где нужно вставить перевод строки: перед двоеточия,  после него или и там, и там. Если этот символ не найден в списке, переводы строк не вставляется.

Электрик-знаки могут также автоматически удалять переводы строк, когда включено средство для их автоматической вставки. Это делает автоматическую вставку переводов строк более приемлимой,  путем удаления  переводов строк в большинстве случаев, когда это было бы желательно; устанавливая переменную c-cleanup-list,  вы можете указать в каких  случаях это происходить.  Значение этой переменной  — это список символов, каждый из которых описывает один случай возможного удаления  перевода строки.  Вот перечень воспринимаемых  символов и их значений:

brace-catch-brace

Сжимает конструкцию  ‘} catch (условие) {’, помещаяя ее  целиком на одну строку.  Сжатие происходит, когда вы набираете ‘{’, если между фигурными скобками нет ничего, кроме catch и условия.

brace-else-brace

Сжимает конструкцию ‘} else  {’, помещаяя  ее целиком на одну строку.  Сжатие происходит, когда вы набираете ‘{’ после else,  но только если между фигурными скобками и else  нет ничего, кроме пропусков.

brace-elseif-brace

Сжимает конструкцию ‘} else  if (…) {’, помещаяя  ее целиком  на одну строку. Сжатие происходит, когда вы набираете ‘{’, если между ‘}’ и ‘{’ нет ничего, кроме пропусков, не считая эти ключевые слова и условие для if.

empty-defun-braces

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

defun-close-semi

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

list-close-comma

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

scope-operator

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

22.15.3  Средство голодного удаления  в Си

Когда включено средство голодного удаления (это показывается в строке режима как

‘/h’  или ‘/ah’  после  имени режима), одна команда hDELi  удаляет весь предшествующий пропуск, а не только одни пробел. Чтобы включать и выключать эту возможность, используйте C-c C-d:

C-c C-d      Включает  или выключает средство голодного  удаления  (c-toggle-hungrystate). С префиксным аргументом, эта команда включает такую возможность, если аргумент положителен, и выключает, если аргумент отрицателен.

Источник: Ричард Столмен, Руководство по GNU Emacs

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

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

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