Це гарне запитання, як я нещодавно тут читав, тому спробую пояснити різницю детальніше:
Пункт 1:
etagsі ctagsобидва генерують файл індексу (він же тег / TAGS) мовних об'єктів, знайдених у вихідних файлах, що дозволяє швидко і легко знаходити ці елементи за допомогою текстового редактора чи іншої утиліти. Тег означає мовний об'єкт, для якого доступна запис індексу (або, альтернативно, запис індексу, створений для цього об'єкта). Теги, що генеруються ctags, є багатшими з точки зору метаданих, але Emacs ніяк не може інтерпретувати додаткові дані, тому вам слід вважати їх більш-менш однаковими (головною перевагою ctagsбуде підтримка більшої кількості мов). Основне використання файлів тегів - це пошук класу / методу / функції / константи / декларації / визначення тощо.
cscopeє набагато потужнішим звіром (принаймні, що стосується C / C ++ та Java). Хоча він працює за більш-менш тим самим принципом (генеруючи файл корисних метаданих), він дозволяє вам робити якісь химерні речі, як-от знайти всі посилання на символ, побачити, де викликається функція тощо (ви також можете знайти визначення) .
Підсумовуючи це:
ctagsодин дозволяє переходити до оголошення / визначення символів (те, що дехто називав би одностороннім пошуком ). 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, але якщо пам'ять мені служить, вони використали етаги.
GTagsпроект, з яким ви пов’язали, досить мертвий. Якщо хтось говорить про цеgtags, вони, ймовірно, посилаються на GNU Global.