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

102

Я работаю над проектами C ++, и я просмотрел руководство Алекса Отта по CEDET и другие темы о тегах в StackOverflow, но я все еще не понимаю, как Emacs взаимодействует с этими различными системами тегов для облегчения автозаполнения, поиска определений, навигации по источнику кодовая база или предварительный просмотр строк документации.

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

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

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

Амелио Васкес-Рейна
источник
2
Судя по стволу , GTagsпроект, с которым вы связались, совсем мертв. Если кто-то говорит о gtagsчем-то, вероятно, имеется в виду GNU Global.
Gordon Gustafson
Добавьте в смесь Universal Ctags - поддерживаемый форк Exuberant Ctags :) ggtags - это пакет Emacs для этого.
legends2k

Ответы:

71

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

Пункт 1:

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

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

Подвести итог:

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

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

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

На данном этапе никого не должно удивлять, что, когда я работаю с проектами C / 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.

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

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

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

Божидар Бацов
источник
1
Это круто. Спасибо! Вы знаете, как я могу использовать cscopeEmacs? Я прочитал о xcscope.elна EmacsWiki здесь , но я не смог найти ссылку на файл. Кроме того, какой .elфайл вы используете для работы cscopeс Emacs?
Амелио Васкес-Рейна
1
xcscope.elнаходится в cscope/contrib/xcscope/(он входит в комплект поставки). Вот что я использую.
Божидар Бацов
Еще один вопрос: как semanticсравнить с cscope? Что касается навигации по исходному коду, предоставляет ли семантика какие-либо функции, которых cscopeнет? Вы используете оба?
Амелио Васкес-Рейна
4
Я не верю, что GNU Global использует etags, кстати. IIRC поддерживает и запрашивает «правильную» базу данных (а не сканирует простой текстовый файл), что дает многочисленные преимущества в производительности как для запросов, так и (особенно) для обновления тегов.
Филс
@BozhidarBatsov Когда ты сказал For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>. Что именно делает этот фрагмент кода?
Амелио Васкес-Рейна,
45

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

Что это?

  • Etags - это команда для генерации файла TAGS, который является файлом тегов для Emacs. Вы можете использовать файл с etags.el, который является частью пакета emacs.
  • Ctags - это команда для создания файла тегов, который является файлом тегов для vi. Universal Ctags, преемник 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, something-gtags.el, helm-gtags.el и т. Д.).

Сравнение

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

Комбинация

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

Попробуйте следующее: (требуется GLOBAL-6.5.3 + и Universal Ctags соответственно)

Сборка GNU GLOBAL:

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

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

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

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

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

$ gtags-cscope          # this is GLOBAL version of cscope

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

Удачи!

Shigio
источник
1
Для пользователей Debian и производных, таких как Ubuntu: веб-страница GNU GLOBAL предупреждает, что пакеты .deb, поставляемые с этими дистрибутивами Linux, устарели и не должны использоваться. В моем случае GLOBAL был на версии 5.7.1, и я не мог заставить gtags.el, ggtags.el или helm-gtags.el правильно работать в Emacs 24. Компиляция GNU GLOBAL 6.5 с нуля с поддержкой Exuberant Ctags ( Я использовал 5.8) Сработало удовольствие. (Спасибо за отличные указатели, @shigio).
Роб
9

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

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 компании использует файлы TAGS .

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

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

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

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

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

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

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

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

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

См. Также это обсуждение HN, сравнивающее global и cscope .

Клиент-серверные проекты

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

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

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

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

Уилфред Хьюз
источник
7

[ответ обновлен от shigio ]

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

Что это?

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

Сравнение

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

Комбинация

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

# 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.

Удачи!

TomRoche
источник
Я прочитал: «Еще раз обратите внимание, что если вы используете Ctags в качестве парсера для ваших Gtags, вы теряете возможность обрабатывать ссылки (например, использование переменных, вызовы функций), которые в противном случае предоставляли бы Gtags. По сути, вы жертвуете отслеживанием ссылок Gtags для Улучшенная встроенная языковая поддержка Ctags ". Верно ли это для старых ctags, поставляемых с Emacs, или это все еще верно для Universal Ctags? Кроме того, я читал «комбинировать богатый язык Universal Ctag», но во фрагменте оболочки, который он использует, --with-exuberant-ctags=...когда теперь, с 2019 года, есть --with-universal-ctagsопция. Следует ли это изменить на последнее?
bgoodr
3

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

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

 (semanticdb-enable-cscope-databases)

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

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

Клеман Б.
источник
1
Похоже, это не работает в Emacs 24.3.1, используя ванильный CEDET 2.0, который поставляется с ним (без метода semanticdb-enable-cscope-databases).
Роб