Редагування програм – ЧАСТИНА 1

У Emacs є багато команд, призначених для розуміння синтаксису мов про-

граммирования, таких як Лісп і Сі Ці команди можуть:

Пересувати або знищувати збалансовані вирази або s-вираження (див

Розділ 222 [Списки], с 206)

Пересувати через або позначати вираження верхнього рівня – визначення функцій

в Ліспі, функції в Сі (див Розділ 224 [Визначення функцій], с 208)

Показувати, як збалансовані круглі дужки (див Розділ 226 [Парність], с 218)

Вставляти, знищувати або вирівнювати коментарі (див Розділ 227 [коментах-

рії], с 219)

Слідувати звичайними угодами про відступи, прийнятих у мові (див Розділ 225 [Відступи в програмах], с 208)

Команди для слів, пропозицій і абзаців дуже зручні при редагуванні програм, навіть хоча їх традиційним застосуванням є редагування текстів на природній мові Більшість символів містять слова (див Розділ 211 [Слова], с 181) пропозиції можуть бути знайдені в рядках або коментарях (див Розділ 212 [Пропозиції], с 182) Абзаци так такі не присутні в коді, але команди роботи з абзацами тим не менш корисні, тому що основні режими для мов програмування визначають абзаци як шматки тексту, що починаються і закінчуються порожніми рядками (див Розділ 213 [Абзаци], с 183) Розумне використання порожніх рядків для поліпшення читаності програми буде також надавати командам, оперрірующім з абзацами, цікаві шматки тексту для роботи

Засіб вибіркового показу корисно для перегляду загальної структури функції (див Розділ 114 [Вибірковий показ], с 83) Це засіб робить так, що на екрані зявляються тільки ті рядки, відступ в яких менше заданої величини

221  Основні режими для мов програмування

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

В ідеалі, основний режим повинен бути реалізований для кожної мови програмування, який ви можете побажати редагувати за допомогою Emacs але часто режим для однієї мови може обслуговувати інші мови зі схожим синтаксисом Існуючі режими для мов – це ті, які хтось взяв на себе працю написати

Є кілька різновидів режиму Lisp, які відрізняються способом взаємодій-

ствия з виконанням Лиспа Див Розділ 238 [Обчислення Лиспа], с 254

Кожен з основних режимів для мови програмування визначає ключ hTABдля запуску функції, що робить відступ, якої відомі угоди про відступи для цієї мови і яка відповідно змінює відступ поточного рядка Наприклад, в режимі С, hTABi  привязаний до c-indent-line Cj зазвичай визначається так, щоб робити hRETi, За яким слід hTABi таким чином, ця команда теж робить відступ в режімозавісімом вигляді

У більшості мов програмування відступ часто змінюється від рядка до рядка Отже, основні режими для таких мов перепрівязивают hDELi  так, щоб він трактував знак табуляції як еквівалентну кількість прогалин (використовуючи команду backward-delete-char-untabify) Це дозволяє стирати відступ по одному стовпцю, не піклуючись про те, зроблений Чи він за допомогою пробілів чи знаків табуляції Щоб видалити в цих режимах знак табуляції перед точкою, використовуйте Cb Cd

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

Включення основного режиму запускає звичайну пастку, звану пасткою режиму, яка є значенням лісповской змінної Для кожного основного режиму є своя пастка, і імя цієї пастки завжди складається з імені команди, яка запускає цей режим, і слова -hook. Наприклад, включення режиму З запускає пастку c-mode-hook, тоді як включення режиму Lisp запускає пастку lisp-mode-hook Див Розділ 3123 [Пастки], с 349

222  Списки і 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 його правильно розумів

223  Команди роботи зі списками та s-виразами

CMf пересунути вперед через s-вираз (forward-sexp) CMb пересунути назад через s-вираз (backward-sexp) CMk Знищити s-вираз вперед (kill-sexp)

C-M-hDELi    Знищити s-вираз тому (backward-kill-sexp)

CMu Перейти вгору і назад за структурою списку (backward-up-list)

CMd Перейти вниз і вперед за структурою списку (down-list)

CMn пересунути вперед через список (forward-list) CMp пересунути назад через список (backward-list) CMt Переставити виразу (transpose-sexps)

CM-@ Поставити мітку після наступного виразу (mark-sexp)

Щоб пересунутися вперед через s-вираз, використовуйте CMf (forward-sexp)

Якщо перша значуща літера після крапки – це відкриває обмежувач (( в Ліспі

‘(, [ Або { в Сі), то CMf пересуває за парний закриває обмежувач Якщо цей знак починає символ, рядок або число, то CMf пересуває через них

Команда CMb (backward-sexp) рухає назад через s-вираз Детальні правила схожі на описані вище для CMf, але з протилежним напрямком Якщо перед s-виразом стоять будь префіксние символи (в Ліспі це одиночна лапка, зворотна лапка і кома), то CMb переходить і через них Команди для s-виразів пересуваються через коментарі, як це робиться для пропусків в більшості режимів

CMf або CMb з аргументом повторюють операцію задане число разів з негативного-

вим аргументом, вони переміщують у протилежному напрямку

Знищення цілого s-вирази може бути зроблено за допомогою CMk (kill-sexp) або CM-hDEL(Backward-kill-sexp) CMk знищує знаки, через які пересунула б CMf, а CM-hDELзнищує знаки, через які пересунула б CMb

Команди для списків пересувають через списки, як і команди s-виразів, але легко перескакують через будь-яку кількість інших видів s-виразів (символи, рядки і так далі) Це C-M-n (forward-list) і C-M-p (backward-list) Вони корисні в основному тим, що зазвичай ігнорують коментарі (так як коментарі як правило не містять ніяких списків)

CMn і CMp залишаються на одному рівні дужок, коли це можливо Щоб пересунутися вгору на один (або n) Рівень, використовуйте CMu (backward-up-list) CMu рухає назад і вгору повз одного непарного відкриває обмежувача Позитивний аргумент служить лічильником повторів негативний аргумент змінює напрямок руху і також запитує повторення, таким чином, в цьому випадку рух відбувається вперед і вгору на один або більше рівнів

Щоб пересунутися вниз по структурі списків, використовуйте CMd (down-list) У режимі Lisp, де ( – це єдиний відкриває обмежувач, це майже те ж саме, що і пошук (. Кількість рівнів дужок, на яке слід спуститися, визначає аргумент

Команда CMt (transpose-sexp), яка переносить попереднє s-вираз через наступне, почасти здається випадково сюди потрапила, але проте вона дуже зручна Аргумент служить для підрахунку числа повторів, а негативний аргумент перетягує вираз у зворотному напрямку (таким чином скасовуючи дію CMt з позитивним аргументом) Аргумент, рівний нулю, замість того щоб нічого не робити, переставляє місцями s-вирази, кончающиеся після точки і мітки

Джерело: Річард Столмен, Керівництво по GNU Emacs

Схожі статті:


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

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*