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

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

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

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

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

5 ответов


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

Точка 1:

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

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

в итоге:

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

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

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

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

пункт 2.

чтобы иметь интеллектуальное автозаполнение, вам нужен true парсер исходного кода (например, семантический), в противном случае вы не будете знать типы объектов (например) в ваших приложениях и методы, которые могут быть вызваны на них. Вы можете иметь автозаполнение на основе многих различных источников, но для получения наилучших результатов вам в конечном итоге понадобится парсер. То же самое касается подсветки синтаксиса - в настоящее время подсветка синтаксиса в основных режимах 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 приносит истинное понимание кода (для нескольких языков, которые он в настоящее время поддерживает) и закрывает разрыв между IDEs и Emacs. Он действительно не взаимодействует с такими инструментами, как etags и cscope, но это не значит, что вы не можете использовать их вместе.

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

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


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

что это?

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

сравнение

  • Ctags и etags обрабатывают только определения. Cscope и GNU GLOBAL рассматривают не только определения, но и ссылки.
  • Ctags и etags используют плоский текстовый файл тегов. Cscope и GNU GLOBAL использует базы данных тегов key-value.
  • 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. Глобальный пакет включает команду с именем "gtags-cscope", которая является портом cscope, то есть сама cscope, за исключением того, что она использует GLOBAL в качестве поисковой системы вместо cscope.

$ gtags-cscope          # this is GLOBAL version of cscope

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

удачи!


файлы тегов содержат определения

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

^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 обеспечивает более приятный интерфейс, когда есть несколько совпадений.

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

теги файлы могут быть построены с помощью различных инструментов

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

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

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

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

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

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

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

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

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

Клиент/Сервер проекты

региональные технические консультативные группы анализирует и индексирует C / C++ с помощью постоянного сервера. Он использует парсер clang, поэтому он очень хорошо обрабатывает C++. Он поставляется с пакетом Emacs для запроса сервера.

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

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

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


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

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

что это?

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

сравнение

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

сочетание

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

# 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 'reference tracking for Ctags' большая встроенная языковая поддержка.

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

удачи!


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

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

 (semanticdb-enable-cscope-databases)

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

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