Це гарне запитання, як я нещодавно тут читав, тому спробую пояснити різницю детальніше:
Пункт 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.