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

В Emacs есть много команд, предназначенных для понимания синтаксиса языков про-

граммирования, таких как Лисп и Си. Эти команды могут:

Передвигать или уничтожать  сбалансированные  выражения или s-выражения (см.

Раздел 22.2 [Списки], с. 206).

Передвигать  через или помечать выражения верхнего уровня — определения функций

в Лиспе, функции в Си (см. Раздел 22.4 [Определения функций], с. 208).

Показывать, как сбалансированы круглые скобки (см. Раздел 22.6 [Парность], с. 218).

Вставлять, уничтожать  или выравнивать комментарии (см.  Раздел 22.7 [Коммента-

рии], с. 219).

Следовать обычным соглашениям об отступах, принятых в языке (см.  Раздел  22.5 [Отступы в программах], с. 208).

Команды для слов, предложений и абзацев очень удобны при редактировании программ, даже хотя их традиционным  применением является редактирование текстов на естественном языке. Большинство  символов содержат слова (см. Раздел 21.1 [Слова], с. 181); предложения могут быть найдены в строках или комментариях (см. Раздел 21.2 [Предложения], с. 182).  Абзацы так  таковые не  присутствуют  в коде,  но команды работы с абзацами тем не менее полезны,  так как основные режимы для языков программирования определяют абзацы как куски текста, начинающиеся и заканчивающиеся пустыми строками (см. Раздел 21.3 [Абзацы], с. 183). Разумное использование пустых строк для улучшения читаемости программы будет также  предоставлять командам, оперрирующим с абзацами, интересные куски текста для работы.

Средство выборочного показа полезно для просмотра общей структуры  функции (см. Раздел 11.4 [Выборочный  показ], с. 83). Это средство делает так, что на экране появляются только те строки, отступ в которых меньше заданной величины.

22.1  Основные режимы для языков программирования

Emacs также  имеет основные режимы для языков программирования Лисп,  Scheme (вариант Лиспа), Awk,  Си, Си++, Фортран, Icon, Java, Objective-C, Паскаль, Perl, Pike, CORBA IDL, и Tcl.  Есть также основной режим для Make-файлов, называемый режимом Makefile. Второй альтернативный режим для Perl называется режимом CPerl.

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

Есть несколько разновидностей режима Lisp, которые отличаются способом взаимодей-

ствия с исполнением Лиспа. См. Раздел 23.8 [Вычисление  Лиспа], с. 254.

Каждый из основных режимов для языка программирования  определяет ключ hTABдля запуска функции, делающей отступ, которой известны соглашения об отступах для этого языка и которая соответственно изменяет отступ текущей строки. Например, в режиме С, hTABi  привязан к c-indent-line.  C-j  обычно определяется так, чтобы делать hRETi, за которым следует hTABi; таким образом, эта команда тоже делает отступ в режимозависимом виде.

В большинстве языков программирования отступ часто изменяется от строки к строке. Следовательно,  основные режимы для таких  языков перепривязывают hDELi  так,  чтобы он трактовал знак табуляции как эквивалентное количество пробелов (используя команду backward-delete-char-untabify).  Это позволяет стирать отступ по одному столбцу, не заботясь о том, сделан ли он с помощью пробелов или знаков табуляции. Чтобы удалить в этих режимах знак табуляции  перед точкой, используйте C-b C-d.

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

Включение основного режима запускает обычную ловушку, называемую ловушкой режима, которая является значением лисповской переменной. Для каждого основного режима есть своя ловушка, и имя этой ловушки всегда составляется из имени команды, запускающей этот режим, и слова ‘-hook’.   Например, включение режима С запускает ловушку c-mode-hook, тогда как включение режима Lisp запускает ловушку lisp-mode-hook.  См. Раздел 31.2.3 [Ловушки], с. 349.

22.2  Списки и s-выражения

По соглашению, ключи Emacs для работы со сбалансированными выражениями обычно являются Control-Meta-знаками.  По действию они стремятся походить на свои Controlи Meta-аналоги. Обычно считается, что эти команды имеют отношение к выражениям в языках программирования, но они могут оказаться полезными в любом языке, в котором существует какая-либо разновидность круглых скобок (включая естественные языки).

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

Другие команды имеют дело с выражениями или s-выражениями.  Слово ‘s-выражение’

происходит от s-expression, старого термина для выражения в Лиспе.  Но в Emacs понятие

‘s-выражение’ не ограничивается  Лиспом. Оно обозначает выражение в любом языке, на котором написана ваша программа. Каждый язык программирования  имеет свой собственный основной режим, который настраивает синтаксические таблицы так, что выражения на этом языке рассматриваются как s-выражения.

Обычно s-выражение включает в себя символы,  числа и строковые константы, а также все, что содержится в круглых, квадратных или фигурных скобках.

В языках, которые используют префиксные и инфиксные операторы, таких как Си, не все выражения  могут быть s-выражениями. Например, режим С не распознает  ‘foo + bar’ как s-выражение, несмотря на то, что это является выражением Си; он распознает ‘foo’ как одно s-выражение и ‘bar’ как другое, со знаком ‘+’ в качестве пунктуации между ними. Это фундаментальная неоднозначность:  как ‘foo + bar’,  так и ‘foo’  являются законными кандидатами на s-выражение,  через которое нужно передвинуться, если точка находится на ‘f’. Заметьте, что ‘(foo + bar)’ — это единое s-выражение в режиме С.

Некоторые языки имеют туманную форму синтаксиса выражений, и никто не позабо-

тился о том, чтобы Emacs его правильно понимал.

22.3  Команды работы со списками и s-выражениями

C-M-f         Передвинуться  вперед через s-выражение (forward-sexp). C-M-b        Передвинуться  назад через s-выражение (backward-sexp). C-M-k        Уничтожить  s-выражение вперед (kill-sexp).

C-M-hDELi    Уничтожить  s-выражение назад (backward-kill-sexp).

C-M-u        Перейти вверх и назад по структуре списка (backward-up-list).

C-M-d        Перейти вниз и вперед по структуре списка (down-list).

C-M-n        Передвинуться  вперед через список (forward-list). C-M-p        Передвинуться  назад через список (backward-list). C-M-t         Переставить выражения (transpose-sexps).

C-M-@           Поставить метку после следующего выражения (mark-sexp).

Чтобы передвинуться вперед через s-выражение,  используйте  C-M-f  (forward-sexp).

Если первая значащая литера после точки — это открывающий ограничитель (‘(’ в Лиспе;

‘(’, ‘[’ или ‘{’ в Си), то C-M-f передвигает за парный закрывающий ограничитель. Если этот знак начинает символ, строку или число, то C-M-f передвигает через них.

Команда C-M-b (backward-sexp) двигает назад через s-выражение.  Подробные правила похожи на описанные выше для C-M-f, но с противоположным направлением. Если перед s-выражением  стоят какие-либо префиксные  символы (в Лиспе  это одиночная кавычка, обратная кавычка и запятая), то C-M-b переходит и через них. Команды для s-выражений передвигаются  через комментарии, как это делается для пропусков в большинстве режимов.

C-M-f или C-M-b с аргументом повторяют операцию заданное число раз; с отрицатель-

ным аргументом, они перемещают в противоположном направлении.

Уничтожение целого s-выражения может быть сделано при помощи C-M-k (kill-sexp) или C-M-hDEL(backward-kill-sexp). C-M-k уничтожает знаки, через которые передвинула бы C-M-f, а C-M-hDELуничтожает знаки, через которые передвинула бы C-M-b.

Команды для списков передвигают  через списки, как и команды s-выражений, но легко перескакивают через любое количество других  видов s-выражений (символы, строки и так далее). Это C-M-n (forward-list) и C-M-p (backward-list).  Они полезны в основном тем, что обычно игнорируют комментарии (так как комментарии как правило не содержат никаких списков).

C-M-n и C-M-p остаются на одном уровне скобок, когда это возможно.  Чтобы передвинуться вверх на один (или n) уровень, используйте C-M-u (backward-up-list).  C-M-u двигает назад и вверх мимо одного непарного открывающего ограничителя. Положительный аргумент служит счетчиком повторов; отрицательный аргумент меняет направление движения и также запрашивает повторение, таким образом, в этом случае движение происходит вперед и вверх на один или больше уровней.

Чтобы передвинуться вниз по структуре списков, используйте  C-M-d (down-list).   В режиме Lisp, где ‘(’ — это единственный открывающий ограничитель, это почти то же самое, что и поиск ‘(’. Количество уровней скобок, на какое следует спуститься, определяет аргумент.

Команда C-M-t (transpose-sexp), которая переносит предыдущее s-выражение через следующее, отчасти кажется случайно сюда попавшей, но тем не менее она очень удобна. Аргумент служит для подсчета числа повторов, а отрицательный аргумент перетаскивает выражение в обратном направлении (таким  образом отменяя действие C-M-t  с положительным аргументом).   Аргумент,  равный нулю, вместо того  чтобы ничего не  делать, переставляет местами s-выражения, кончающиеся после точки и метки.

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

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

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

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