Это хороший вопрос, который я недавно прочитал здесь, поэтому я постараюсь объяснить разницу более подробно:
Пункт 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посмотреть, как семантика автоматически завершится за вас. Для языков, в которых семантика не включена по умолчанию, вы можете добавить следующую строку в ваш основной обработчик режима:
(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)
Пункт 3.
семантика обеспечивает истинную осведомленность о коде (для нескольких языков, которые он в настоящее время поддерживает) и сокращает разрыв между IDE и Emacs. На самом деле он не взаимодействует с такими инструментами, как etags
и cscope
, но это не значит, что вы не можете использовать их вместе.
Надеюсь, мои объяснения будут иметь смысл и будут вам полезны.
PS Я не совсем знаком с global
и ebrowse
, но если мне не изменяет память, они использовали etags.
GTags
проект, с которым вы связались, совсем мертв. Если кто-то говорит оgtags
чем-то, вероятно, имеется в виду GNU Global.