Теги для Emacs: взаимосвязь между etags, ebrowse, cscope, GNU Глобальные и буйные ctags

Я работаю над проектами на С++, и я прошел через Alex Ott руководство по CEDET и другим темам о тегах в StackOverflow, но я все еще запутался о том, как Emacs взаимодействует с этими различными системами тегов для облегчения автозаполнения, поиска определений, навигации по исходной кодовой базе или предварительного просмотра doc-строк.

  • В чем разница (например, с точки зрения возможностей) между etags, ebrowse, exuberant ctags, cscope, GNU Global и GTags? Что мне нужно сделать, чтобы использовать их в Emacs?

  • Нужен ли мне семантический/сенатор (CEDET), если я хочу использовать теги для навигации/автозаполнения символов?

  • Что делает семантический вывод в таблицу поверх этих различных утилит тегов? Как он взаимодействует с этими инструментами?

Ответ 1

Это хороший вопрос, который я недавно прочитал здесь, поэтому попробую объяснить разницу более подробно:

Точка 1:

etags и ctags генерируют файл индексов (a.k.a. tag/TAGS) языковых объектов, найденных в исходных файлах, который позволяет быстро и легко размещать эти элементы в текстовом редакторе или другой утилите. Тег обозначает объект языка, для которого доступна запись индекса (или, альтернативно, запись индекса, созданная для этого объекта). Теги, сгенерированные ctags, богаче с точки зрения метаданных, но Emacs не может интерпретировать дополнительные данные в любом случае, поэтому вы должны рассматривать их более или менее одинаково (основным преимуществом ctags будет поддержка большего количества языков). Основное использование файлов тегов - поиск деклараций/определений класса/метода/функции/константы/etc.

cscope - гораздо более мощный зверь (по крайней мере, насколько C/С++ и Java). Хотя он работает по более или менее одинаковому принципу (генерируя файл полезных метаданных), он позволяет вам делать некоторые более интересные вещи, такие как найти все ссылки на символ, посмотреть, где вызывается функция, и т.д. (Вы также можете найти определения),

Подводя итог:

ctags один позволяет вам перейти к объявлению/определениям символов (что некоторые вызовут односторонний поиск). ctags - универсальный инструмент, полезный для многих языков.

С другой стороны (как указано на странице проекта) cscope позволяет:

  • Перейти к объявлению символа
  • Показать выбранный список всех ссылок на символ
  • Искать любое глобальное определение
  • Функции, вызываемые функцией
  • Функции, вызывающие функцию
  • Поиск текстовой строки
  • Поиск шаблона регулярных выражений
  • Найти файл
  • Найти все файлы, включая файл

На данный момент ни для кого не удивительно, что когда я занимаюсь проектами C/С++, я сильно использую cscope и очень мало забочусь о ctags. При работе с другими языками ситуация, очевидно, будет отменена.

Точка 2.

Для интеллектуального автозаполнения вам нужен истинный парсер исходного кода (например, семантический), иначе вы не будете знать типы объектов (например) в своем приложений и методов, которые могут быть вызваны на них. У вас может быть автозаполнение, основанное на разных источниках, но для получения наилучших результатов вам в конечном итоге понадобится парсер. То же самое касается подсветки синтаксиса - подсветка синтаксиса в основных режимах Emacs основана только на регулярных выражениях и очень хрупкой и подверженной ошибкам. Надеюсь, с включением семантики в Emacs 23.2 (раньше это был внешний пакет), мы начнем больше использовать для него (например, использовать его для анализа исходного кода буфера, чтобы правильно выделить его)

Так как семантика Emacs 24.1 может использоваться из рамки завершения Emacs. Самый простой способ проверить это - открыть файл исходного кода C и ввести M-TAB или C-M-i и посмотреть, как семантика завершается автоматически для вас. Для языков, в которых семантика не включена по умолчанию, вы можете добавить следующую строку в ваш основной выбор режима:

(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)

Точка 3.

semantic приносит истинное понимание кода (для немногих языков, которое он в настоящее время поддерживает) и закрывает разрыв между IDE и Emacs. Он действительно не взаимодействует с такими инструментами, как etags и cscope, но это не значит, что вы не можете использовать их вместе.

Надеюсь, мои объяснения имеют смысл и будут полезны для вас.

P.S. Я не совсем знаком с global и ebrowse, но если память мне помогает, они использовали etags.

Ответ 2

Я попытаюсь добавить некоторые пояснения к 1.

Что это такое?

  • Etags - это команда для создания файла TAGS, который является файлом тегов для Emacs. Вы можете использовать файл с etags.el, который является частью пакета emacs.
  • Ctags - это команда для создания файла тегов, который является файлом тега для vi. Теперь Exuberant Ctags может генерировать файл TAGS с помощью опции -e и поддерживать 41 язык программирования.
  • Cscope - это универсальный инструмент для просмотра исходного кода для языка C. У этого есть собственный тонкий CUI (пользовательский интерфейс символов) и базы данных тегов (cscope.in.out, cscope.out, cscope.po.out). Вы можете использовать cscope из Emacs, используя xcscope.el, который является частью пакета cscope.
  • GNU GLOBAL - это система маркировки исходного кода. Хотя он аналогичен описанным выше инструментам, он отличается от них тем, что он зависит от любого редактора, и у него нет пользовательского интерфейса, кроме командной строки. Gtags - это команда генерации файлов тегов для GLOBAL (GTAGS, GRTAGS, GPATH). Вы можете использовать GLOBAL из emacs, используя gtags.el, который является частью пакета GLOBAL. В дополнение к этому, для него существует много библиотек elisp (xgtags.el, ggtags.el, anything-gtags.el, helm-gtags.el и т.д.).

Сравнение

  • Ctags и etags обрабатывают только определения. Cscope и GNU GLOBAL относятся не только к определениям, но и к ссылкам.
  • Ctags и etags используют файл с плоскими текстовыми тегами. Cscope и GNU GLOBAL используют базы данных ключевых значений.
  • Cscope и GNU GLOBAL имеют grep-подобную поисковую систему и инкрементное средство обновления файлов тегов.

Комбинация

Вы можете комбинировать расширенную поддержку языка Exuberant Ctags и базу данных GNU GLOBAL с помощью ctags в качестве плагина-анализатора GLOBAL.

Попробуйте следующее: (требуется GLOBAL-6.0, Exuberant Ctags-5.5 или новее соответственно)

Построение GNU GLOBAL:

$ ./configure --with-exuberant-ctags=/usr/local/bin/ctags
$ sudo make install

Использование:

$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
$ export GTAGSLABEL=ctags
$ gtags                     # invokes Exuberant Ctags internally
$ emacs -f gtags-mode       # load gtags.el

(Тем не менее, вы не можете обрабатывать ссылки этим методом, потому что ctags не обрабатывают ссылки.)

Вы также можете использовать cscope в качестве клиента GNU GLOBAL. GLOBAL-пакет включает в себя команду с именем "gtags-cscope", которая является портом cscope, то есть сама cscope, за исключением того, что она использует GLOBAL как поисковую систему, а не cscope one.

$ gtags-cscope          # this is GLOBAL version of cscope

С помощью комбинаций вы можете использовать cscope для 41 языка.

Удачи!

Ответ 3

Файлы TAGS содержат определения

Файл A TAGS содержит список функций и классов. Обычно он помещается в корень проекта и выглядит так:

^L
configure,3945
as_fn_success () { as_fn_return 0; }^?as_fn_success^A180,5465
as_fn_failure () { as_fn_return 1; }^?as_fn_failure^A181,5502
as_fn_ret_success () { return 0; }^?as_fn_ret_success^A182,5539
as_fn_ret_failure () { return 1; }^?as_fn_ret_failure^A183,5574

Это позволяет Emacs находить определения. Базовая навигация встроена с find-tag, но etags-select обеспечивает более удобный интерфейс, если имеется несколько совпадений.

Вы также можете использовать файлы TAGS для завершения кода. Например, компания etags backend использует файлы TAGS.

Файлы TAGS могут быть созданы различными инструментами

ctags (ранее известный как "универсальные ctags" или "exuberant ctags" ) может генерировать файлы TAGS и поддерживает самый широкий диапазон языков, Он активно поддерживается на github.

Emacs поставляется с двумя программами, которые генерируют файлы TAGS, называемые etags и ctags. Emacs ctags - это просто etags с тем же интерфейсом CLI, что и универсальные ctags. Чтобы избежать путаницы, многие дистрибутивы переименовывают эти программы (например, ctags.emacs24 на Debian).

Существуют также специальные инструменты для создания файлов TAGS, такие как jsctags и hasktags.

Другие форматы файлов

ebrowse - это программа C, поставляемая с Emacs. Он индексирует код C/С++ и генерирует файл BROWSE. ebrowse.el обеспечивает обычное определение и завершение поиска. Вы также можете открыть файл BROWSE непосредственно в Emacs, чтобы получить обзор классов/функций, определенных в базе кода.

GNU Global имеет свой собственный формат базы данных, который состоит из файлов GTAGS, GRTAGS и GPATH. Вы можете сгенерировать эти файлы командой GTAGS, которая анализирует код C/С++. Для других языков GNU Global может читать файлы, созданные универсальными ctags.

GNU Global также предоставляет интерфейс CLI для задания более сложных вопросов, например "где упоминается этот символ?". Он поставляется с пакетом Emacs gtags.el, но ggtags.el также популярен для доступа к глобальным базам данных GNU.

Cscope похож по духу на GNU Global: он анализирует C/С++ в своем собственном формате базы данных. Он также может отвечать на такие вопросы, как "найти всех вызывающих/вызываемых лиц этой функции".

См. также это обсуждение HN, сравнивающее глобальные и cscope.

Проекты клиент/сервер

rtags анализирует и индексирует C/С++ с использованием постоянного сервера. Он использует анализатор clang, поэтому он отлично справляется с С++. Он отправляет пакет Emacs для запроса сервера.

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

Семантический (CEDET)

Semantic - это встроенный пакет Emacs, содержащий синтаксический анализатор для C/С++, поэтому он также может найти определения. Он также может импортировать данные из файлов TAGS, баз данных csope и других источников. CEDET также включает в себя функциональность стиля IDE, которая использует эти данные, например. генерируя диаграммы UML иерархии классов.

Ответ 4

[ответ обновлен с shigio 's]

Я попытаюсь добавить некоторые пояснения к первой части вопроса.

Что это такое?

  • Etags создает файл TAGS, который является форматом тега для Emacs. Вы можете использовать файл Etags с etags.el, который является частью Emacs.
  • Ctags - это общий термин для всего, что может генерировать файл TAGS, который является форматом файла родного тега для Vi. Universal Ctags (aka UCtags, ранее Exuberant Ctags) также может генерировать Etags с опцией -e.
  • Cscope - это инструмент для просмотра всего исходного кода для C (с меньшей поддержкой для С++ и Java), с его собственные теги базы данных (cscope.in.out, cscope.out, cscope.po.out) и TUI. Поддержка Cscope встроена в Vim; вы можете использовать Cscope из Emacs, используя пакет xcscope.el. Существуют также графические интерфейсы на основе Cscope.
  • GNU GLOBAL (aka Gtags) - еще одна система тегов исходного кода (со значительными отличиями - см. следующий раздел), в том он также генерирует файлы тегов.

Сравнение

  • Ctags и Etags обрабатывают только определения (например, переменных и функций). Cscope и Gtags также рассматривают ссылки.
  • Файлы тегов Ctags и Etags flat. Cscope и Gtags tagfiles более мощные базы данных ключа, которые позволяют (например) инкрементное обновление.
  • Cscope и Gtags имеют поисковую систему grep.
  • Ctags имеет встроенную поддержку для большего количества языков и форматов данных: см. текущий список парсеров Universal Ctags. UCtags также документировал, как разработать собственный парсер.
  • Cscope и Gtags независимы от редактора.
  • Gtags не предоставляет собственный пользовательский интерфейс, но в настоящее время (октябрь 2016) может использоваться из командной строки (CLI), Emacs и родственников, Vi и родственников, less (пейджер), Doxygen и любой веб-браузер.
  • Gtags предоставляет gtags.el через пакет GLOBAL, но есть также много других расширений elisp, включая xgtags.el, ggtags.el, anything-gtags.el, helm-gtags.el.

Комбинация

Вы можете комбинировать поддержку расширенного языка Universal Ctags с базой данных Gtags и многочисленными расширениями, используя Ctags в качестве GLOBAL plug-in parser:

# build GNU GLOBAL
./configure --with-exuberant-ctags=/usr/local/bin/ctags
sudo make install

# use it
export GTAGSCONF=/usr/local/share/gtags/gtags.conf
export GTAGSLABEL=ctags
gtags                     # invokes Universal Ctags internally
emacs -f gtags-mode       # load gtags.el

Заметим еще раз, что если вы используете Ctags в качестве парсера для своих Gtags, вы теряете способность обрабатывать ссылки (например, использование переменных, вызовы функций), которые в противном случае предоставляли бы Gtags. По сути, вы торгуете контрольным отслеживанием Gtags для большей встроенной поддержки языка Ctags.

Вы также можете использовать Cscope в качестве клиента Gtags: gtags-cscope.

Удачи!

Ответ 5

Я действительно не проверял, но в соответствии с руководством CEDET (http://www.randomsample.de/cedetdocs/common/cedet/CScope.html):

semantic может использовать CScope в качестве задней части для поиска базы данных. Чтобы включить его, используйте:

 (semanticdb-enable-cscope-databases)

Это позволит использовать cscope для всех буферов C и С++.

Затем CScope будет использоваться для поиска в рамках проекта в качестве резервной копии, если ранее существующие поиски семантической базы данных, возможно, не проанализировали все ваши файлы.