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

Emacs хранит в каждый момент одну выбранную таблицу тегов, и все команды для работы с таблицами тегов используют эту выбранную таблицу. Чтобы выбрать таблицу тегов, наберите  M-x visit-tags-table,  которая считает имя файла таблицы тегов как аргумент. Имя ‘TAGS’ в каталоге по умолчанию используется как имя файла по умолчанию.

Все, что делает эта команда, — сохраняет имя файла в переменной tags-file-name. Emacs фактически не считывает содержимое таблицы тегов до тех пор, пока вы не попытаетесь использовать его. Самостоятельная установка этой переменной так же хороша, как и использование visit-tags-table.  Начальное значение переменной равно nil; это значение сообщает всем командам для работы с таблицами тегов, что они должны запрашивать, какое имя файла таблицы тегов надо использовать.

Использование visit-tags-table, когда таблица тегов уже загружена, дает вам выбор: вы можете  добавить новую таблицу тегов к текущему списку таких  таблиц или начать новый список. Команды работы с тегами используют  все таблицы тегов в текущем списке. Если вы начинаете новый список, новая таблица тегов используется вместо остальных. Если вы добавляете новую таблицу тегов к текущему списку, она используется вместе с остальными. Когда команды работы с тегами сканируют список таблиц тегов, они не всегда начинают с начала списка; они начинают с первой таблицы, которая описывает текущий файл (если такая есть), проходят далее до конца списка и затем просматривают список с начала до тех пор, пока в нем не будут проверены  все таблицы.

Вы можете явно задать список таблиц тегов, установив переменную tags-table-list в значение списка строк, как показано:

(setq tags-table-list

’("~/emacs"  "/usr/local/lib/emacs/src"))

Это заставляет команды, работающие с тегами, просматривать  файлы ‘TAGS’ в каталогах

‘~/emacs’ и ‘/usr/local/lib/emacs/src’.   Порядок зависит от того,  в каком файле  вы сейчас находитесь и какая таблица тегов упоминает этот файл, как обяснено выше.

Не установливайте переменные tags-file-name и tags-table-list одновременно.

22.13.4  Поиск определения  тега

Самая важная вещь, которую вам позволяют делать таблицы тегов, — это поиск опре-

деления конкретного тега.

M-. тег hRETi

Найти первое определение тега (find-tag).

C-u M-.      Найти следующее по очереди определение последнего заданного тега.

C-u M-.   Вернуться к предыдущему найденному тегу.

C-M-. образец hRETi

Найти тег, чье имя совпадает с образцом (find-tag-regexp).

C-u C-M-.   Найте следующий тег, чье имя совпадает с последним использованным образ-

цом.

C-x 4 . тег hRETi

Найте  первое определение  тега,  но показать его в другом окне  (find-tagother-window).

C-x 5 . тег hRETi

Найте  первое определение  тега и создать новый фрейм  для выбора буфера

(find-tag-other-frame).

M-*             Вернуться к тому месту, где вы ранее вызвали M-. и товарищей.

M-. (find-tag) — это команда для поиска определения заданного тега. Она ищет его по таблице тегов как строку и затем использует эту информацию из таблицы тегов для того, чтобы определить файл, в котором находится определение,  и приблизительную положение определения в файле.  Затем find-tag обращается к этому файлу, передвигает точку в приблизительную позицию и начинает поиск определения на постоянно возрастающем расстоянии.

Если задается пустой аргумент (просто hRETi), то в качестве имени тега, который надо найти, используется  s-выражение,  находящееся в буфере  перед или вокруг  точки.   Для получения информации о s-выражениях смотрите Раздел 22.2 [Списки], с. 206,

Аргумент для M-. не обязан быть полным именем тега; достаточно части. Это возможно, потому что M-. находит в таблице теги, которые содержат тег как построку. Однако, она предпочитает точное совпадение совпадению лишь построки. Чтобы найти другие теги, которые соответствуют той же подстроке, следует дать find-tag числовой аргумент, как в C-u M-.; эта команда не считываает  имя тега, но продолжает поиск по тексту таблицы тегов другого тега, содержащего самую последнюю использованную подстроку. Если у вас есть настоящая клавиша hMETAi, то M-0 M-. может служить более простой альтернативой C-u M-..

Подобно большинству команд, которые могут  переключать буферы, find-tag имеет вариант, который показывает новый буфер в другом окне,  и еще один, который создает новый фрейм. Первая команда — это C-x 4 ., которая вызывает функцию find-tag-otherwindow. Вторая, C-x 5 ., вызывает find-tag-other-frame.

Чтобы вернуться к местам, где  вы недавно находили теги, используйте  C-u M-.;  в более общем  виде,  M-. с отрицательным числовым аргументом.  Эта команда может перенести вас в другой буфер. C-x 4 . с отрицательным аргументом находит предыдущее положение тега в другом окне.

Так же, как вы можете вернуться к местам, где вы недавно находили теги, вы можете вернуться к  местам, откуда  вы их нашли.  Используйте  для этого M-*, что вызывает команду pop-tag-mark.  Типичное применение этих команд — найти и изучить определение чего-то с помощью M-. и затем вернуться к тому месту, где вы были, с помощью M-*.

И C-u M-., и M-* позволяют вам пошагово проходить назад до глубины, определяемой переменной find-tag-marker-ring-length.

Команда C-M-. (find-tag-regexp)  обращается к тегам, соответствующим заданному регулярному выражению. Она похожа на M-., но производит сопоставление с регулярным выражением, а не со строкой.

22.13.5  Поиск и замена при помощи таблиц  тегов

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

M-x tags-search hRETi regexp hRETi

Поиск regexp во всех файлах в выбранной таблице тегов.

M-x tags-query-replace hRETi regexp hRETзамена hRETi

Осуществить query-replace-regexp в каждом файле в выбранной таблице те-

гов.

M-,             Перезапустить одну из вышеупомянутых команд из текущего положения точки

(tags-loop-continue).

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

Найдя одно соответствие, вы, вероятно, захотите найти все остальные. Чтобы найти еще одно соответствие, наберите M-, (tags-loop-continue), это возобновит tags-search. Эта команда просматривает остаток текущего буфера и затем оставшиеся файлы таблицы тегов.

M-x tags-query-replace осуществляет во всех файлах в таблице  тегов единую  замену регулярного выражения с подтверждением.  Она считывает регулярное выражение, которое следует  искать,  и  строку  для замены, точно  так  же,  как  обычная M-x query-replace-regexp.   Она ищет очень похоже  на M-x tags-search,  но с повторами, обрабатывая совпадения согласно вашему вводу.  См.  Раздел 12.7 [Замена], с. 95, более подробную информацию о замене с подтверждением.

Можно пройти по всем файлам в таблице тегов с помощью едиственного  вызова M-x tags-query-replace. Но иногда бывает полезно временно выйти, что вы можете сделать с помощью любого события ввода, не имеющего особого смысла при замене с подтверждением.  Вы можете  впоследствии возобновить замену с подтверждением, набрав M-,;  эта команда возобновляет последнюю сделанную вами команду поиска или замены тегов.

Команды этого раздела  приводят к  гораздо  более  широкому поиску, чем семейство find-tag.    Команды find-tag ищут  только определения  тегов,  совпадающих с вашей подстрокой или регулярным выражением. Команды tags-search и tags-query-replace находят каждое вхождение регулярного выражения, как делают в текущем буфере обычные команды поиска и замены.

Эти команды создают буферы только временно,  для файлов, в которых они должны делать поиск (для тех, к которым уже не обращается какой-нибудь  буфер Emacs). Буферы, в которых нет совпадений, быстро уничтожаются; остальные продолжают существовать.

Вас, возможно, поразило, что tags-search очень похожа на grep.  Вы можете  также запустить саму grep как подчиненную  Emacs, и Emacs покажет вам совпадающие строки одну за другой.   Это работает во многом похоже  на запуск компиляции; обращение  к тем позициям в исходных файлах, где grep нашла совпадения, работает как обращение к ошибкам компиляции. См. Раздел 23.1 [Компиляция], с. 247.

22.13.6  Запросы  к таблице  тегов

M-x list-tags hRETфайл hRETi

Показать список тегов, определенных в заданном файле с текстом программы.

M-x tags-apropos hRETi regexp hRETi

Показать список всех тегов, соответствующих регулярному выражению regexp.

M-x list-tags считывает имя одного из файлов, описанных в выбранной таблице тегов, и показывает список всех тегов, определенных в этом файле.  Аргумент “имя файла” фактически является просто строкой для сравнения с именами, записанными в таблице тегов; он считывается как строка, а не как имя файла. Поэтому завершение и значение по умолчанию невозможны, и вы должны вводить имя файла в том же самом виде, в котором

оно появляется в таблице тегов. Не включайте каталог как часть имени файла, если имя файла, записанного в таблице тегов, не включает каталог.

M-x tags-apropos похожа на apropos для тегов (см. Раздел 7.3 [Контекстная справка], с. 57).  Она считывает регулярное выражение, затем находит все теги в выбранной таблице тегов, чьи вхождения соответствуют этому регулярному выражению, и показывает найденные имена тегов.

Вы также можете производить в буфере завершение в пространстве имен, составленном из имен тегов текущих таблиц. См. Раздел 22.9 [Завершение символов], с. 222.

22.14  Объединение файлов с помощью Emerge

Нередко программисты перебегают друг другу дорогу и изменяют одну и ту же программу в двух разных направлениях. Чтобы справиться с этой путаницей, вам необходимо объединить две эти версии. Emerge упрощает это. Смотрите также Раздел 14.9 [Сравнение файлов],  с. 132, о командах для сравнения  файлов  более ручным методом, и раздел “Emerge” в The Ediff Manual.

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

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

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

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