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

число, n     Перші n аргументів цієї функції вважаються відмінними аргументами, решта розглядаються як тіло вираження Рядок у цьому виразі відступається згідно з тим, чи є в ній перший аргумент відмітним чи ні Якщо аргумент є частиною тіла, то рядок відступається на lisp-body-indent стовпців більше, ніж відкриває дужка, починаюча її містить вираз Якщо аргумент є відмітною, і це перший або другий аргумент, то відступ робиться на вдвічі більшу кількість додаткових стовпців Якщо аргумент характерний і не є першим або другим, то для цього рядка застосовується стандартний шаблон

символ, символ

символ повинен бути імям функції ця функція викликається для обчислення відступу рядка в межах цього виразу Функція отримує два аргументи:

стан Значення, що повертається з parse-partial-sexp (це примітив Лиспа для підрахунку величини відступів і вкладення), коли вона робить розбір аж до початку цього рядка

позиція Позиція, з якої починається рядок, в якій робиться відступ

Вона повинна повертати або число, яке дорівнює кількості стовпців отсту-

па для цього рядка, або список, чий головний елемент є таким числом

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

2254  Команди для відступів в Сі

Ось команди для створення відступів в режимі C і споріднених з ним:

Cc Cq Обновляє відступ у поточному визначенні функції верхнього рівня або соби-

рает в одне ціле оголошення типу (c-indent-defun)

CMq Обновляє відступ в кожному рядку збалансованого вираження, яке слід після крапки (c-indent-exp) Префіксний аргумент пригнічує перевірку помилок і висновок попереджень про неприпустимий синтаксисі

hTABi              Оновлює відступ в поточному рядку та / або в деяких випадках вставляє знак табуляції (c-indent-command)

Якщо c-tab-always-indent дорівнює t, ця команда завжди оновлює відступ те-

Кучок рядки і не робить нічого більше Це приймається за замовчуванням

Якщо ця змінна дорівнює nil, дана команда оновлює відступ поточного рядка, тільки якщо точка знаходиться з лівого краю або на відступі в іншому випадку вона вставляє табуляцію (або еквівалентну число прогалин, якщо indent-tabs-mode дорівнює nil)

Будь-яке інше значення (Не nil або t) означає, що потрібно завжди оновлювати відступ рядки, а також вставляти знак табуляції, якщо точка знаходиться всередині коментаря, рядка або директиви препроцесора

C-u hTABi     Оновлює відступ поточного рядка відповідно до її синтаксисом крім того, жорстко зміщує всі інші рядки вираження, що починається на поточному рядку Див Розділ 2252 [Багатостроковий відступ], с 209

Щоб оновити відступ всього поточного буфера, наберіть Cx h CM-\ Це спочатку виділяє весь буфер як область, а потім оновлює відступ в цій галузі

Щоб оновити відступ у поточному блоці, використовуйте CMu CMq Ця команда пере-

міщан до початку блоку і робить у ньому відступ

2255  Налаштування відступу в Сі

Режим C і споріднені режими використовують простий, але гнучкий механізм для настройки відступу Цей механізм працює в два етапи: спочатку рядки класифікуються синтаксично відповідно з їх вмістом і контекстом потім кожному виду синтаксичних конструкцій привязується значення зсуву, який ви можете налаштувати

22551  Крок 1 — синтаксичнийаналіз

На першому кроці механізм відступів в Сі дивиться на рядок перед тією, в якій ви в даний момент робите відступ, і визначає синтаксичні компоненти конструкції на цьому рядку Він будує список цих синтаксичних компонентів, де кожен компонент містить синтаксичний символ і, іноді, позицію в буфері Деякі синтаксичні символи описують граматичні елементи, наприклад statement і substatement інші описують положення в складі граматичних елементів, наприклад class-open і knr-argdecl

По ідеї, рядок коду на Сі завжди має відступ щодо відступу якийсь рядки вище з цього буферу Це представляється позицією в буфері в списку синтаксичних компонентів

Ось приклад Припустимо, що у нас є наступний код в буфері з режимом C + +

(Номери рядків насправді не зявляються в буфері):

1:  void  swap (int&amp a,  int&amp b)

2:  {

3:      int tmp = a

4:      a = b

5:      b = tmp

6:  }

Якщо ви наберете Cc Cs (що запускає команду c-show-syntactic-information) на рядку 4, буде показаний результат роботи механізму відступів для цього рядка:

((statement   32))

Це вказує на те, що даний рядок є оператором, і вона має відступ щодо позиції 32 в буфері, тобто щодо i в int на рядку 3 Якщо ви перемістіть курсор до рядка 3 і наберете Cc Cs, це покаже наступне:

((defun-block-intro 28))

Це вказує на те, що рядок int – це перший оператор в блоці, і вона має відступ щодо позиції 28, тобто фігурної дужки відразу після заголовка функції

Ось ще один приклад:

1:  int add (int val, int incr, int doit)

2:  {

3:      if (doit)

4:          {

5:             return (val + incr)

6:          }

7:      return (val)

8:  }

Якщо в рядку 4 набрати Cc Cs, ви побачите ось що:

((substatement-open 43))

Це говорить, що дана фігурна дужка відкриває блок подоператора До речі, подоператор – це рядок після операторів if, else, while, do, switch, for, try, catch, finally або synchronized

Усередині команд для відступу в Сі, після того як рядок синтаксично проаналіцірована, опис результатів аналізу зберігається в списку у змінній c-syntactic-context Кожен елемент цього списку – це синтаксичний компонент: пара, яка містить синтаксичний символ і (можливо) відповідну йому позицію в буфері У списку компонент може декілька елементів як правило тільки один з них має позицію в буфері

22552  Крок 2 — підрахунок відступу

Механізму відступів в Сі обчислює величину відступу для поточного рядка, використовуючи список синтаксичних компонентів, c-syntactic-context, отриманий з синтаксичного аналізу Кожен компонент – це пара, яка містить синтаксичний символ і може містити позицію в буфері

Кожен компонент дає внесок в остаточний відступ рядки двома шляхами По-

перший, синтаксичний символ визначає елемент c-offsets-alist, це асоціативний

список, що ставить у відповідність синтаксичним символам величини зсуву Зрушення кожного синтаксичного символу додається до загального відступу По-друге, якщо компонент включає позицію в буфері, до відступу додається номер стовпчика цієї позиції Всі ці зрушення і номера стовпців з сумі дають загальний відступ

Наступні приклади демонструють роботу механізму відступів в мові Сі:

1:  void  swap (int&amp a,  int&amp b)

2:  {

3:      int tmp = a

4:      a = b

5:      b = tmp

6:  }

Припустимо, що точка знаходиться на рядку 3, і ви натискаєте hTABi, Щоб оновити в цьому рядку відступ Як пояснювалося вище (див Розділ 22551 [Синтаксичний аналіз], с 211), синтаксичним Компонет цього рядка буде:

((defun-block-intro 28))

У даному випадку при підрахунку відступу спочатку проглядається defun-block-intro в асоціативному списку c-offsets-alist Припустимо, що там знайдено число 2 воно додається до загального (ініціалізованих нулем), видаючи загальної оновлений відступ в 2 пробілу

Наступний крок – знайти номер шпальти для позиції 28 в буфері Оскільки фігурна дужка у позиції 28 розташована в нульовому стовпці, до загального числа додається 0 Так як в цьому рядку є тільки один синтаксичний компонет, загальний відступ для цього рядка дорівнює двом пробілам

1:  int add (int val, int incr, int doit)

2:  {

3:      if (doit)

4:          {

5:             return(val + incr)

6:          }

7:      return(val)

8:  }

Якщо ви натиснете hTABу рядку 4, повторюється такий же процес, але з іншими даними

Список синтаксичних компонентів для цього рядка такий:

((substatement-open 43))

Тут перше, що робиться для за рахунками відступу, – шукається символ substatement-open в c-offsets-alist Будемо вважати, що зрушення для цього символу дорівнює 2 У цьому місці проміжне загальне значення дорівнює 2 (0 + 2 = 2) Потім до нього додається номер рядка позиції 43 в буфері, де стоїть i з if на рядку 3 Цей знак розташований у другому стовпці на рядку Разом в сумі виходить 4 пробілу

Якщо при аналізі рядка зявляється синтаксичний символ, який відсутній в c-offsets-alist, він ігнорується і це є помилкою, якщо крім того мінлива c-strict-syntax-p відмінна від nil

22553  Зміна стилю відступів

Є два способи налаштувати стиль відступів для режимів, подібних режиму C Поперше, ви можете вибрати один із зумовлених стилів, кожен з яких задає зрушення для всіх синтаксичних символів Для більшої гнучкості ви можете Налаштувати обробку окремих синтаксичних символів Див Розділ 22554 [Синтаксичні символи], с 214, перелік всіх визначених синтаксичних символів

M-x c-set-style hRETстиль hRETi

Вибирає зумовлений стиль стиль Щоб отримати перелік підтримуваних стилів, наберіть при введенні стилю знак; щоб дізнатися, як виглядає той чи інший стиль, виберіть його і застосуйте для фрагмента коду на Сі

C-c C-o символ hRETзсув hRETi

Встановлює зрушення для синтаксичного символу символ (c-set-offset)

Другий аргумент, зсув, вказує нову величину зсуву

Розмір відступу для кожного синтаксичного символу управляється змінної coffsets-alist Її значення – це асоціативний список, і кожен елемент цього списку має форму (синтаксичнийсимвол зрушення) Змінюючи зрушення для різних синтаксичних символів, ви можете налаштовувати відступи в найдрібніших подробицях Щоб змінити цей асоціативний список, використовуйте c-set-offset (дивіться нижче)

Джерело: Річард Столмен, Керівництво по 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>

*

*