Теги для Emacs: Зв'язок між етагами, ebrowse, cscope, GNU Global та насиченими ctags


102

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

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

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

  3. Що семантичне відображає до таблиці поверх цих різних утиліт? Як він взаємодіє з цими інструментами?


2
Судячи з багажника , GTagsпроект, з яким ви пов’язали, досить мертвий. Якщо хтось говорить про це gtags, вони, ймовірно, посилаються на GNU Global.
Гордон Густафсон

Відповіді:


71

Це гарне запитання, як я нещодавно тут читав, тому спробую пояснити різницю детальніше:

Пункт 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, але якщо пам'ять мені служить, вони використали етаги.


1
Це чудово. Дякую! Чи знаєте ви, як я можу використовувати cscopeв Emacs? Я читав про xcscope.elEmacsWiki тут, але не зміг знайти посилання на файл. Крім того, який .elфайл ви використовуєте для отримання cscopeEmacs?
Амеліо Васкес-Рейна

1
xcscope.elзнаходиться в cscope/contrib/xcscope/(це знаходиться в пакеті розповсюдження). Саме цим я і користуюся.
Божидар Бацов

Ще одне питання: як semanticпорівнювати cscope? Що стосується навігації по вихідному коду, чи дає семантична функція, cscopeяка не відповідає? Ви використовуєте обидва?
Амеліо Васкес-Рейна

4
Я не вірю в GNU глобальне використання етагів, btw. IIRC він підтримує і запитує "належну" базу даних (а не сканування плоского текстового файлу), яка має численні переваги як для запитів, так і (особливо) для оновлення тегів.
phils

@BozhidarBatsov Коли ти сказав For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>. Що саме робить цей фрагмент коду?
Амеліо Васкес-Рейна

45

Спробую додати кілька пояснень до 1.

Що це?

  • Etags - це команда для створення файлу 'TAGS', який є тегом для Emacs. Ви можете використовувати файл з etags.el, який є частиною пакету emacs.
  • Ctags - це команда для створення файлу "тегів", що є файлом тегів для vi. Тепер Exuberant Ctags може генерувати файл 'TAGS' за допомогою опції -e та підтримувати 41 мову програмування.
  • Cscope - це все-в-одному інструмент перегляду вихідного коду для мови C. Він має власний тонкий CUI (інтерфейс користувача символів) та бази даних тегів (cscope.in.out, cscope.out, cscope.po.out). Ви можете використовувати cscope від Emacs, використовуючи xcscope.el, який є частиною пакету cscope.
  • GNU GLOBAL - це система маркування вихідного коду. Хоча він подібний до вищезазначених інструментів, він відрізняється від них тим, що він залежить від будь-якого редактора, і він не має інтерфейсу користувача, крім командного рядка. Gtags - це команда для створення файлів тегів для GLOBAL (GTAGS, GRTAGS, GPATH). Ви можете використовувати GLOBAL від emacs, використовуючи gtags.el, який є частиною пакету GLOBAL. Окрім цього, для нього існує багато бібліотек elisp (xgtags.el, ggtags.el, something-gtags.el, helm-gtags.el тощо).

Порівняння

  • Ctags та etags розглядають лише визначення. Cscope та GNU GLOBAL трактують не лише визначення, але й посилання.
  • Для тегів та етагів використовується файл із тегом плоского тексту. Cscope та GNU GLOBAL використовують бази даних тегів ключових значень.
  • Cscope та GNU GLOBAL мають подібні пошукові системи та додаткові можливості оновлення файлів тегів.

Комбінація

Ви можете комбінувати підтримку багатою мовою Exuberant Ctags та базу даних GNU GLOBAL, використовуючи ctags як аналізатор плагінів GLOBAL.

Спробуйте виконати наступні дії: (потрібні GLOBAL-6.0, великі 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. Пакет GLOBAL включає команду з назвою 'gtags-cscope', яка є портом cscope, тобто це сам самий cscope, за винятком того, що він використовує GLOBAL як пошукову систему замість цього.

$ gtags-cscope          # this is GLOBAL version of cscope

За допомогою комбінацій можна скористатися мовою на 41 мові.

Удачі!


1
Для користувачів на Debian та таких похідних, як Ubuntu: веб-сторінка GNU GLOBAL попереджає, що пакети .deb, що постачаються з цими дистрибутивами Linux, датовані і не повинні використовуватися. У моєму випадку GLOBAL був на версії 5.7.1, і я не міг змусити gtags.el, ggtags.el або helm-gtags.el належним чином працювати над Emacs 24. Компіляція GNU GLOBAL 6.5 з нуля, з підтримкою Exuberant Ctags ( Я використовував 5,8) працював частування. (Дякую за відмінні покажчики, @shigio).
Роб

9

Файли TAGS містять визначення

TAGSФайл містить список , де функції і класи визначені. Зазвичай він розміщується в корені проекту і виглядає так:

^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забезпечує приємніший інтерфейс користувача, коли є кілька збігів.

Ви також можете використовувати файли TAGS для заповнення коду. Наприклад, бекенд етагів компанії використовує файли TAGS .

Файли TAGS можна будувати різними інструментами

ctags(раніше відомий як «універсальні ctags» або «великі ctags») може створювати файли TAGS та підтримувати найширший діапазон мов. Він активно підтримується на гітубі.

Emacs постачається з двома програмами, які генерують файли TAGS, звані etagsта ctags. Emacs ' ctagsпросто etagsз тим же інтерфейсом CLI, що і універсальні 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 може читати файли, створені універсальними ctags.

GNU Global також пропонує інтерфейс CLI для задачі більш складних питань, таких як "де цей символ згадується?". Він постачається з пакетом Emacs gtags.el, але ggtags.el також популярний для доступу до баз даних GNU Global.

Cscope схожий за духом з GNU Global: він аналізує C / C ++ у власному форматі бази даних. Він також може відповісти на запитання, як "знайти всіх абонентів / викликів цього функціоналу".

Дивіться також цю НН дискусію, порівнюючи глобальний та рекордний .

Клієнтські / серверні проекти

rtags розбирає та індексує C / C ++ за допомогою стійкого сервера. Він використовує аналізатор clang, тому дуже добре обробляє C ++. Він постачається з пакетом Emacs для запиту сервера.

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

Семантичний (CEDET)

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


7

[відповідь оновлена ​​від shigio 's]

Я спробую додати деякі пояснення до частини 1 питання.

Що це?

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

Порівняння

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

Комбінація

Ви можете поєднати підтримку розширеної мови Universal Ctags з базою даних Gtags та численними розширеннями, використовуючи Ctags як аналізатор плагінів GLOBAL :

# 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 для більшої вбудованої мови підтримки Ctags.

Ви можете також використовувати Cscope в якості клієнта Gtags: gtags-cscope.

Удачі!


Я читаю: "Знову зауважте, що якщо ви використовуєте Ctags як аналізатор своїх Gtags, ви втрачаєте можливість обробляти посилання (наприклад, використання змінних, виклики функцій), які Gtags інакше надавали б. По суті, ви торгуєте відстеженням посилань Gtags для "Більша вбудована підтримка мови". Це правда для старих ctags, що постачаються разом з Emacs, чи це все ще вірно для Universal Ctags? Крім того, я читав "поєднувати багату мову Universal Ctag", але у фрагменті оболонки він використовує, --with-exuberant-ctags=...коли зараз на 2019 рік є --with-universal-ctagsваріант. Чи слід це змінити на останнє?
bgoodr

3

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

семантичний може використовувати CScope в якості зворотного кінця для пошуку в базі даних. Щоб увімкнути це, використовуйте:

 (semanticdb-enable-cscope-databases)

Це дасть можливість використовувати cscope для всіх буферів C і C ++.

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


1
Схоже, це не працює в Emacs 24.3.1, використовуючи ванільний CEDET 2.0, який постачається з ним (не метод seanticdb-enable-cscope-databases).
Роб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.