Я работаю над проектами C ++, и я просмотрел руководство Алекса Отта по CEDET и другие темы о тегах в StackOverflow, но я все еще не понимаю, как Emacs взаимодействует с этими различными системами тегов для облегчения автозаполнения, поиска определений, навигации по источнику кодовая база или предварительный просмотр строк документации.
В чем разница (например , с точки зрения функций) между
etags
,ebrowse
,exuberant ctags
,cscope
,GNU Global
иGTags
? Что мне нужно сделать, чтобы использовать их в Emacs ?Нужен ли мне семантический / сенатор (CEDET), если я хочу использовать теги для навигации / автозаполнения символов?
Что делает семантика в таблице поверх этих различных утилит тегов? Как он взаимодействует с этими инструментами?
emacs
cscope
cedet
gnu-global
Амелио Васкес-Рейна
источник
источник
GTags
проект, с которым вы связались, совсем мертв. Если кто-то говорит оgtags
чем-то, вероятно, имеется в виду GNU Global.Ответы:
Это хороший вопрос, который я недавно прочитал здесь, поэтому я постараюсь объяснить разницу более подробно:
Пункт 1:
etags
иctags
оба генерируют индексный (также известный как тег / TAGS) файл языковых объектов, найденных в исходных файлах, который позволяет быстро и легко найти эти элементы с помощью текстового редактора или другой утилиты. Тег означает языковой объект, для которого доступна запись указателя (или, альтернативно, запись указателя, созданная для этого объекта). Теги, генерируемые ctags, богаче с точки зрения метаданных, но Emacs все равно не может интерпретировать дополнительные данные, поэтому вы должны считать их более или менее одинаковыми (основным преимуществомctags
будет поддержка большего количества языков). Основное использование файлов тегов - поиск объявлений / определений класса / метода / функции / константы / и т.д.cscope
намного более мощный зверь (по крайней мере, в отношении C / C ++ и Java). Хотя он работает по более или менее тому же принципу (создание файла полезных метаданных), он позволяет вам делать некоторые более интересные вещи, например, находить все ссылки на символ, видеть, где вызывается функция и т. Д. (Вы также можете найти определения) .Подвести итог:
ctags
one позволяет переходить к объявлению / определениям символов (что некоторые называют односторонним поиском ).ctags
это инструмент общего назначения, полезный для многих языков.С другой стороны (как указано на странице проекта)
cscope
позволяет:На данном этапе никого не должно удивлять, что, когда я работаю с проектами C / C ++, я интенсивно использую их
cscope
и очень мало о них беспокоюсьctags
. При работе с другими языками ситуация, очевидно, будет обратной.Пункт 2.
Чтобы иметь интеллектуальное автозаполнение, вам нужен настоящий парсер исходного кода (например, семантический), иначе вы не будете знать типы объектов (например) в ваших приложениях и методы, которые могут быть вызваны для них. У вас может быть автозаполнение на основе множества разных источников, но для получения наилучших результатов вам в конечном итоге понадобится синтаксический анализатор. То же самое и с подсветкой синтаксиса - в настоящее время подсветка синтаксиса в основных режимах Emacs основана просто на регулярных выражениях, что очень хрупко и подвержено ошибкам. Надеюсь, с включением семантики в Emacs 23.2 (до этого он был внешним пакетом) мы начнем видеть больше его применений (например, его использование для анализа исходного кода буфера, чтобы правильно выделить его)
Поскольку семантика Emacs 24.1 может использоваться из инфраструктуры завершения Emacs. Самый простой способ проверить это - открыть файл с исходным кодом C и ввести M-TABили C-M-iпосмотреть, как семантика автоматически завершится за вас. Для языков, в которых семантика не включена по умолчанию, вы можете добавить следующую строку в ваш основной обработчик режима:
Пункт 3.
семантика обеспечивает истинную осведомленность о коде (для нескольких языков, которые он в настоящее время поддерживает) и сокращает разрыв между IDE и Emacs. На самом деле он не взаимодействует с такими инструментами, как
etags
иcscope
, но это не значит, что вы не можете использовать их вместе.Надеюсь, мои объяснения будут иметь смысл и будут вам полезны.
PS Я не совсем знаком с
global
иebrowse
, но если мне не изменяет память, они использовали etags.источник
cscope
Emacs? Я прочитал оxcscope.el
на EmacsWiki здесь , но я не смог найти ссылку на файл. Кроме того, какой.el
файл вы используете для работыcscope
с Emacs?xcscope.el
находится вcscope/contrib/xcscope/
(он входит в комплект поставки). Вот что я использую.semantic
сравнить сcscope
? Что касается навигации по исходному коду, предоставляет ли семантика какие-либо функции, которыхcscope
нет? Вы используете оба?For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>
. Что именно делает этот фрагмент кода?Попробую добавить пояснения к 1.
Что это?
Сравнение
Комбинация
Вы можете объединить широкую языковую поддержку Universal Ctags и возможности базы данных GNU GLOBAL, используя ctags в качестве синтаксического анализатора плагина GLOBAL.
Попробуйте следующее: (требуется GLOBAL-6.5.3 + и Universal Ctags соответственно)
Сборка GNU GLOBAL:
Использование:
(Однако вы не можете обрабатывать ссылки этим методом, потому что ctags не обрабатывает ссылки.)
Вы также можете использовать cscope как клиент GNU GLOBAL. Пакет GLOBAL включает команду с именем 'gtags-cscope', которая является портом cscope, то есть это сама cscope, за исключением того, что она использует GLOBAL в качестве поисковой системы вместо cscope.
С комбинациями вы можете использовать cscope для 41 языка.
Удачи!
источник
Файлы TAGS содержат определения
TAGS
Файл содержит список , где функции и классы определены. Обычно он помещается в корень проекта и выглядит так:Это позволяет Emacs находить определения. Базовая навигация встроена
find-tag
, ноetags-select
обеспечивает более приятный интерфейс при наличии нескольких совпадений.Вы также можете использовать файлы TAGS для завершения кода. Например, серверная часть etags компании использует файлы TAGS .
Файлы TAGS могут быть созданы разными инструментами
ctags
(ранее называвшиеся универсальными тегами ctags или обильными тегами ctags) могут создавать файлы TAGS и поддерживают самый широкий спектр языков. Он активно поддерживается на гитхабе.Emacs поставляется с двумя программами, которые генерируют файлы TAGS, которые называются
etags
иctags
. Emacsctags
имеет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 иерархий классов.
источник
[ответ обновлен от shigio ]
Попробую добавить пояснения к первой части вопроса.
Что это?
TAGS
файл, который является форматом файла тегов для Emacs . Вы можете использовать файл Etags,etags.el
который является частью Emacs.Ctags
- это общий термин для всего, что может создатьtags
файл, который является собственным форматом файла тегов для Vi. Универсальные Ctags (также известные какUCtags
Exuberant Ctags) также могут создавать Etags с-e
опцией.cscope.in.out
,cscope.out
,cscope.po.out
) и TUI . Поддержка Cscope встроена в Vim; вы можете использовать Cscope из Emacs, используя пакет xcscope.el . Существуют также графические интерфейсы на основе Cscope .Gtags
) - еще одна система тегов исходного кода (со значительными отличиями - см. Следующий раздел), поскольку она также генерирует файлы тегов.Сравнение
grep
поисковая машина.less
(пейджер), Doxygen и любого веб-браузера.gtags.el
пакет GLOBAL, но есть также много других расширений elisp, включая xgtags.el, ggtags.el, something-gtags.el, helm-gtags.el.Комбинация
Вы можете объединить богатую языковую поддержку Universal Ctags с базой данных Gtags и многочисленными расширениями, используя Ctags в качестве синтаксического анализатора GLOBAL плагина :
Заметим еще раз, что если вы используете Ctags в качестве парсера для ваших Gtags, вы теряете возможность обрабатывать ссылки (например, использование переменных, вызовы функций), которые Gtags иначе предоставили бы. По сути, вы жертвуете отслеживанием ссылок Gtags в пользу большей встроенной языковой поддержки Ctags.
Вы также можете использовать Cscope в качестве клиента Gtags :
gtags-cscope
.Удачи!
источник
--with-exuberant-ctags=...
когда теперь, с 2019 года, есть--with-universal-ctags
опция. Следует ли это изменить на последнее?Я на самом деле не проверял, но согласно руководству CEDET ( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):
semantic может использовать CScope в качестве серверной части для поиска в базе данных. Чтобы включить его, используйте:
Это позволит использовать cscope для всех буферов C и C ++.
Затем CScope будет использоваться для поиска по всему проекту в качестве резервной копии, когда ранее существовавшие семантические поиски в базе данных могли не проанализировать все ваши файлы.
источник