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

Чтобы  установить область вокруг  следующего  s-выражения в буфере,  используйте C-M-@  (mark-sexp),  которая ставит пометку в то же  самое  место, куда должна бы была передвинуться C-M-f.  C-M-@ воспринимает аргумент так же, как C-M-f.  В частности, отрицательный аргумент удобен для установки метки в начале предыдущего s-выражения.

Понимание синтаксиса командами для списков и s-выражений полностью управляется синтаксической таблицей. Любой знак может быть объявлен,  например, открывающим ограничителем и действовать как открывающая круглая скобка. См. Раздел 31.6 [Синтаксис], с. 366.

22.4  Определения функций

В Emacs, заключенные в скобки группы на верхнем уровне в буфере называются  определениями функций.  Это название происходит от того факта, что большинство списков верхнего уровня в Лисп-файле  — это экземпляры специальной  формы defun,  но любая группа верхнего уровня, заключенная в скобки, на языке Emacs понимается как определение функции, независимо от ее содержания  и от используемого языка программирования. Например, тело функции в Си — это определение функции.

C-M-a        Передвинуться к началу текущего или предшествующего  определения функции

(beginning-of-defun).

C-M-e        Передвинуться в конец текущего или следующего определения функции (endof-defun).

C-M-h        Пометить область вокруг всего текущего или следующего определения функции

(mark-defun).

Команды движения к началу или концу текущего определения функции — это C-M-a

(beginning-of-defun) и C-M-e (end-of-defun).

Если вы пожелаете произвести какие-то действия над текущим определением функции, используйте C-M-h (mark-defun), которая ставит точку в начале и метку в конце текущего или следующего определения функции. Например, это простейший способ получить готовое для перемещения в другое место определение функции. В режиме С, C-M-h запускает функцию c-mark-function, которая почти эквивалентна mark-defun; различие состоит в том, что она переходит  через объявления аргументов, имя функции и тип возвращаемых данных, так  что функция Си оказывается внутри области полностью.  См.  Раздел 8.4 [Пометка объектов], с. 65.

Emacs предполагает, что любые открывающие скобки, найденные в самом левом столбце, — это начало определения функции. Поэтому никогда не ставьте открывающие скобки с левого края в Лиспфайле, если они не являются началом списка верхнего уровня. Никогда не ставьте  открывающую фигурную скобку или другой открывающий ограничитель в начале строки в программе на Си, если только они не начинают тело функции. Большинство возможных проблем возникает, когда вы хотите поставить открывающий ограничитель в начале строки внутри строковой константы.  Чтобы избежать неприятностей, поставьте экранирующий знак (‘\’ в Си и Emacs Lisp, ‘/’ в некоторых других диалектах Лиспа) перед открывающим ограничителем. Это не повлияет на содержимое строки.

В очень далеком прошлом оригинальный  Emacs находил определения функций, двигаясь вверх по уровням скобок до тех пор, пока не доходил до уровня, от которого некуда было идти дальше.  Это всегда требовало просмотра полного пути обратно до начала буфера, даже для маленькой функции. Чтобы ускорить эту операцию, Emacs был изменен, и теперь он предполагает, что любой знак ‘(’ (или любой другой, приписанный к синтаксическому классу открывающего ограничителя) на левой границе строки — это начало определения функций.  Эта эвристика почти всегда правильна и позволяет избежать  ресурсоемкого просмотра; однако, она требует выполнения описанных выше соглашений.

22.5  Отступы в программах

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

Emacs также предоставляет программу структурной печати для Лиспа, реализованную в библиотеке pp. Эта программа переформатирует лисповский объект, выбирая отступы таким образом, чтобы результат хорошо выглядел и удобно читался.

22.5.1  Основные  команды для отступов в программах

hTABi              Установить отступ текущей строки.

C-j              Эквивалент hRETi, за которым следует hTAB(newline-and-indent).

Основная команда отступа — это hTABi, которая дает текущей строке правильный отступ,  основываясь  на отступе  предыдущих строк.   Функция,  которую  запускает hTABi, зависит от основного режима; в режиме Lisp это lisp-indent-line,  в режиме С это cindent-line и так далее.  Эти функции понимают различные синтаксисы разных языков, но все они делают примерно одно и то же. hTABв основном режиме любого языка программирования вставляет или удаляет пробельные знаки в начале текущей строки, независимо от того, где в строке располагается точка. Если точка находится среди пробельных знаков в начале строки, hTABi  оставляет  ее после них; в противном случае hTABi  оставляет точку фиксированной по отношению к окружающим ее знакам.

Чтобы вставить в точке знак табуляции, используйте C-q hTABi.

При вводе нового кода используйте  C-j  (newline-and-indent), которая эквивалентна hRETi, за которой следует hTABi. C-j  создает пустую строку, а затем дает ей соответствующий отступ.

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

Помните,  что  открывающие круглые  и фигурные  скобки или другие открывающие ограничители на левом крае рассматриваются  Emacs (и правилами отступа)  как  начало функции.  Поэтому вы никогда не  должны ставить открывающий ограничитель, не являющийся началом функции, в нулевом столбце, даже внутри строковой константы. Это ограничение жизненно важно для скорости работы команд отступа; вы должны просто принять его. Для более подробной  информации  об этом смотрите Раздел 22.4 [Определения функций], с. 208.

22.5.2  Отступ в нескольких строках

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

C-M-q        Сделать новый отступ во всех строках в пределах одного списка (indent-sexp).

C-u hTABi     Сдвинуть весь список жестко в сторону так, чтобы его первая строка получила надлежащий отступ.

C-M-\         Сделать новый отступ во всех строках в области (indent-region).

Вы можете вновь сделать отступ содержимого одиночного списка, переместив точку в его начало и набрав C-M-q (это команда indent-sexp в режиме Lisp, c-indent-exp в режиме С; она также привязана к другим подходящим функциям в других режимах). Отступ строки, на которой начинается это s-выражение,  не изменяется; поэтому изменяется только относительный отступ в пределах списка, а не его позиция. Чтобы исправить также и его позицию, наберите hTABперед C-M-q.

Если относительный отступ внутри списка правильный, но отступ его первой строки

— нет, перейдите к этой строке и наберите C-u hTABi. hTABс числовым аргументом делает в текущей строке обычный отступ, а затем изменяет отступ во всех строках в группе, начиная с текущей, на ту же самую величину. Другими словами, она обновляет отступ целой

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

Можно указать диапазон строк, в которых следует вновь сделать отступ, другим способом — с помощью области. Команда C-M-\ (indent-region) применяет hTABi  к каждой строке, чей первый знак находится между точкой и меткой.

22.5.3  Настройка отступов для Лиспа

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

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

Если переменная lisp-indent-offset не равна nil, то она перекрывает обычный шаблон отступа для второй строки выражения, так  что  такие строки всегда сдвигаются вправо на lisp-indent-offset столбцов дальше, чем содержащий их список.

Стандартный шаблон перекрывается в некоторых определенных функциях. Для функций, чьи имена начинаются с def,  отступ второй строки всегда делается на lisp-bodyindention дополнительных  столбцов дальше открывающей скобки, начинающей выражение.

Стандартный  шаблон может  перекрываться различными способами для отдельных функций согласно свойству имени этой функции lisp-indent-function.  Есть четыре варианта для этого свойства:

nil        Это то же самое, что и отсутствие свойства; используется стандартный шаблон отступа.

defun         Шаблон, используемый для имен функций, которые начинаются с def,  также используется и для этой функции.

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

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

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

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