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

Таблицы тегов хранятся в файлах, именуемых  файлами таблиц тегов.  Общепринятое имя для файла таблицы тегов — ‘TAGS’.

Каждый  элемент в таблице тегов записывает имя одного тега, имя файла, в котором этот тег определен (явно), и местоположение определения тега в этом файле.

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

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

В наиболее популярных языках синтаксис тегов определяется следующим образом:

В программе  на Си, любая функция Си или 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="def:newcommand:newenvironment" export   TEXTAGS

задает (с использованием синтаксиса Bourne shell), что команды ‘\def’, ‘\newcommand’

и ‘\newenvironment’  также определяют теги.

В коде на Лиспе любая функция, определенная через defun, любая переменная, определенная через defvar  или defconst, и вообще первый аргумент любого выражения, которое начинается с ‘(def’ в нулевом столбце, являются тегом.

В коде на Scheme теги включают все определяемое  с помощью def или конструкции, чье имя начинается с ‘def’.  Они также включают переменные, установленные с помощью set! на верхнем уровне файла.

Поддерживаются также несколько других языков:

В коде  ассемблера, теги — это метки, появляющиеся в начале строки, за  которыми идет двоеточие.

Во входных файлах Bison или Yacc каждое правило определяет конструируемый  им нетерминал как тег. Части файла, содержащие код на Си, анализируются как код Си.

В коде  на Cobol тегами служат имена параграфов; то есть любые слова,  которые начинаются в столбце 8, и после которых стоит точка.

В коде на Erlang тегами служат определенные в файле функции, записи и макросы.

В Фортран-коде тегами являются функции, подпрограммы и блоки данных.

В коде на Паскале тегами будут определенные в файле функции и процедуры.

В коде на Perl тегами являются процедуры, определяемые ключевым словом sub.

В коде на Postscript тегами являются функции.

В коде на Прологе теги появляются на левой границе.

Вы также можете генерировать теги, основываясь на сопоставлении регулярных выражений (см.  Раздел 22.13.2 [Создание  таблицы тегов], с. 226), чтобы обработать другие форматы и языки.

22.13.2  Создание  таблицы тегов

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

etags  входныефайлы…

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

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

Если данные таблицы тегов становятся устаревшими из-за изменений в описанных в таблице файлах, то таблица тегов обновляется тем же способом, что был применен для ее начального создания. Нет необходимости делать это часто.

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

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

Одна таблица тегов может как бы включать другую.  Имя включаемого файла тегов указывается с помощью ключа ‘-include=файл’ при создании включающего файла. Последний  файл затем ведет себя  так,  как  если бы он содержал все файлы, заданные во включенном  файле, так же как и те файлы, которые он содержит непосредственно.

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

Если в качестве аргументов etags  вы зададите абсолютные  имена файлов,  то файл тегов будет содержать абсолютные  имена.  Тогда  файл тегов будет так  же  ссылаться на те  же  исходные файлы, даже  если вы переместите  его, до тех  пор, пока исходные файлы остаются на старом месте.   Абсолютные имена файлов  начинаются с ‘/’,  или с

‘устройство:/’ в MS-DOS и MS-Windows.

Когда вы хотите создать таблицы тегов для очень большого числа файлов, у вас могут возникнуть проблемы с их перечислением в командной строке, поскольку некоторые системы накладывают ограничение на ее длину.  Простейший способ обойти это ограничение

— сказать etags считывать имена файлов со стандартного ввода, набрав дефис на месте имен файлов, как здесь:

find . -name "*.[chCH]" -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 / voo.doo  -regex=/reg2 / \

bar.ber -R -lang=lisp los.er

Здесь etags выбирает язык для анализа ‘voo.doo’ и ‘bar.ber’ в соответствии с их содержимым. etags также использует reg1 для распознавания дополнительных  тегов в ‘voo.doo’ и оба выражения reg1 и reg2 для распознавания дополнительных  тегов в ‘bar.ber’.  Для распознавания тегов в ‘los.er’ etags использует правила тегов для Лиспа и не использует регулярные выражения.

Вот еще несколько примеров. Регулярные выражения взяты в кавычки, чтобы оболочка не интерпретировала  их по-своему.

Сделать теги для макроса DEFVAR в исходных файлах Emacs:

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

Сделать теги  для 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.

22.13.3  Выбор  таблицы тегов

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

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

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

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