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

Таблиці тегів зберігаються у файлах, іменованих файлами таблиць тегів Загальноприйнята імя для файлу таблиці тегів – TAGS.

Кожен елемент в таблиці тегів записує імя одного тега, імя файлу, в якому цей тег визначений (явно), і місце розташування визначення тега в цьому файлі

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

22131  Синтаксис тегів вихідного файлу

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

У програмі на Сі, будь-яка функція Сі чи typedef – це тег, тегом є і визначення struct, union і enum Визначення макросів (# define) і констант (enum) також є тегами, якщо тільки ви не задали при створенні таблиці тегів ключ

‘-No-defines. Аналогічно, тегами є глобальні змінні, якщо тільки ви не задали ключ -no-globals. Використання -no-globals і -no-defines може зробити файли таблиць тегів набагато менше

У коді на Сі + +, крім всіх тегів коду Сі розпізнаються також функції-члени і, можливо, змінні-члени, якщо ви використовуєте ключ -members. Теги для змінних і функцій у класах іменуються як клас :: змінна і клас :: функція.

У коді на Java, теги включають всі конструкції, які розпізнаються в Сі + + плюс конструкції extends і implements Теги для змінних і функцій у класах іменуються як класспеременная і классфункція.

У тексті для LaTEX, тегами служать аргументи кожної з команд \ chapter,

\section, \subsection, \subsubsection, \eqno, \label, \ref, \cite, \bibitem, \part,

\ Appendix, \ entry або \ index

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

TEXTAGS=&quotdef:newcommand:newenvironment&quot export   TEXTAGS

задає (з використанням синтаксису Bourne shell), що команди \ def, \ newcommand

і \ newenvironment також визначають теги

У коді на Ліспі будь-яка функція, визначена через defun, будь-яка змінна, визначена через defvar або defconst, і взагалі перший аргумент будь вирази, яке починається з (def в нульовому стовпці, є тегом

У коді на Scheme теги включають всі визначається за допомогою def або конструкції, чиє імя починається з def. Вони також включають змінні, встановлені за допомогою set на верхньому рівні файлу

Підтримуються також кілька інших мов:

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

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

У коді на Cobol тегами служать імена параграфів тобто будь-які слова, які починаються в стовпці 8, і після яких стоїть крапка

У коді на Erlang тегами служать певні у файлі функції, запису та макроси

У Фортран-коді тегами є функції, підпрограми і блоки даних

У коді на Паскалі тегами будуть визначені в файлі функції і процедури

У коді на Perl тегами є процедури, що визначаються ключовим словом sub

У коді на Postscript тегами є функції

У коді на Пролозі теги зявляються на лівій межі

Ви також можете генерувати теги, грунтуючись на зіставленні регулярних виразів (див Розділ 22132 [Створення таблиці тегів], с 226), щоб обробити інші формати і мови

22132  Створення таблиці тегів

Для створення файлу таблиці тегів використовується програма etags Вона знає декілька мов, як описано в попередньому розділі etags запускається наступним чином:

etags вхідніфайли ..

Програма etags зчитує вказані файли і записує таблицю тегів під імям

‘TAGS в поточному робочому каталозі etags розпізнає мову, використовуваний у вхідному файлі, грунтуючись на імені цього файлу і його змісті Ви можете вказати мову за допомогою ключа -language = імя, описаного нижче

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

Якщо таблиця тегів не в змозі записати тег або записує його не для того файлу, то Emacs може не знайти його визначення Однак, якщо позиція, записана в таблицю тегів, стає трохи невірної (За деякого редагування у файлі, в якому знаходиться визначення цього тега), то єдиним наслідком буде злегка уповільнений пошук тега Навіть якщо зберігається позиція зовсім неправильна, Emacs таки знайде тег, але для цього він повинен буде обстежити весь файл

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

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

Якщо при запуску etags ви задасте вихідні файли за відносними іменам, файл тегів буде містити імена файлів, відносні до каталогу, в якому цей файл тегів був спочатку записаний Тоді ви зможете перемістити все дерево каталогів, що містить і файл тегів, і вихідні файли, і файл тегів все одно буде правильно посилатися на вихідні файли

Якщо в якості аргументів etags ви задасте абсолютні імена файлів, то файл тегів міститиме абсолютні імена Тоді файл тегів буде так само посилатися на ті ж вихідні файли, навіть якщо ви перемістіть його, до тих пір, поки вихідні файли залишаються на старому місці Абсолютні імена файлів починаються з /, або з

‘Пристрій :/ в MS-DOS і MS-Windows

Коли ви хочете створити таблиці тегів для дуже великого числа файлів, у вас можуть виникнути проблеми з їх перерахуванням в командному рядку, оскільки деякі системи накладають обмеження на її довжину Найпростіший спосіб обійти це обмеження

– Сказати etags зчитувати імена файлів зі стандартного вводу, набравши дефіс на місці імен файлів, як тут:

find -name &quot*[chCH]&quot -print  | etags  –

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

Ключ -regex надає загальний спосіб розпізнавання тегів, заснований на зіставленні з регулярним виразом Ви можете вільно перемішувати ці ключі з іменами файлів Кожен ключ -regex додається до попередніх і застосовується тільки до подальших файлам Синтаксис такий:

-regex=/regexp-тег [/regexp-імя] /

деregexp-тег використовується для знаходження рядків тегів Воно завжди зачеплення, тобто веде себе так, як якби на початку стояло ^. Якщо ви хочете врахувати відступи, просто назвіть збігом довільне кількість пропусків, почавши ваше регулярний вираз з [\ t] *. Знак \ в регулярних виразах екранує наступний знак, а \ t позначає символ табуляції Зверніть увагу, etags і не виконує жодних інші керуючі послідовності Сі для спеціальних знаків

etags дотримується того ж синтаксису регулярних виразів, що і Emacs, але з введенням оператора інтервалу, який працює як в grep і ed Синтаксис оператора інтервалу такий: \ {m,n\} , Це означає, що потрібно знайти збіг з попереднім виразом щонайменше m раз і аж до n разів

regexp-тег не повинно збігатися з великим числом знаків, ніж це необхідно для розпізнавання потрібного вам тега Якщо відповідність таке, що regexp-тег неминуче збігається з більшим, ніж потрібно, числом знаків, ви можете знайти корисним додати regexp-імя, щоб звузити область тега Ви можете знайти приклади нижче

Ключ -R видаляє всі регулярні вирази, визначені ключами -regex. Він застосовується до наступних за ним іменах файлів, як ви можете бачити з наступного прикладу:

etags  -regex=/reg1 / voodoo  -regex=/reg2 / \

barber -R -lang=lisp loser

Тут etags вибирає мову для аналізу voodoo і barber відповідно з їх вмістом etags також використовує reg1 для розпізнавання додаткових тегів в voodoo і обидва вирази reg1 і reg2 для розпізнавання додаткових тегів в barber. Для розпізнавання тегів в loser etags використовує правила тегів для Лиспа і не використовує регулярні вирази

Ось ще кілька прикладів Регулярні вирази взяті в лапки, щоб оболонка НЕ ​​інтерпретувала їх по-своєму

Зробити теги для макросу DEFVAR у вихідних файлах Emacs:

-regex=’/[ \t]*DEFVAR_[A-Z_ \t(]+&quot\([^&quot]+\)&quot/’

Зробити теги для VHDL-файлів (цей приклад – один рядок, розбита тут для правильного форматування):

-language=none

-regex=’/[ \t]*\(ARCHITECTURE\|CONFIGURATION\)  +[^  ]*  +OF/’

-regex=’/[ \t]*\(ATTRIBUTE\|ENTITY\|FUNCTION\|PACKAGE\

\( BODY\)\|PROCEDURE\|PROCESS\|TYPE\)[  \t]+\([^ \t(]+\)/\3/’

Зробити теги для файлів на Tcl (цей останній приклад показує використання аргументу regexp-імя):

-lang=none  -regex=’/proc[ \t]+\([^ \t]+\)/\1/’

Щоб отримати перелік інших доступних ключів etags, виконайте etags – help

22133  Вибір таблиці тегів

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

*

*