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 hRETi замена 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 hRETi файл 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

March 30th, 2012
admin
Опубликовано в рубрике
Метки: