cscope або ctags чому вибирати одне над іншим? [зачинено]


131

Я в основному використовую vim / gvim в якості редактора і розглядаю комбінацію lxr (Linux Cross Reference) та cscope або ctags для дослідження джерела ядра. Однак я ніколи не використовував ні cscope, ні ctags і хотів би почути, чому можна вибрати один за іншим, беручи до уваги моє використання vim як основного редактора.

Відповіді:


157

ctags дозволяє дві функції: дозволяє переходити з викликів функцій до їх визначень та завершення omni. Перший означає, що коли ви закінчите дзвінок до методу, натисніть g]або CTRL-]перескочете на місце, де визначений або реалізований цей метод. Друга особливість означає, що коли ви вводите foo.або foo->, і якщо foo - це структура, то буде показано спливаюче меню із заповненням поля.

У cscope також є перша особливість - використання set cscopetag- але не остання. Однак додатково додається можливість стрибати в будь-яке місце, де викликається функція.

Що стосується стрибків навколо кодової бази, то теги завжди будуть вести вас до того місця, де функція реалізована, тоді як cscope може показати вам, де також називається функція.

Чому ви обираєте одне над іншим? Ну, я використовую і те, і інше. ctags простіше налаштувати, швидше запустити, і якщо ви дбаєте лише про стрибок в один бік, він покаже вам менше ліній. Можна просто бігати :!ctags -R .і g]просто працює. Це також дозволяє це все повне.

Cscope чудово підходить для великих, невідомих баз коду. Налаштування - це біль, тому що cscope потребує файлу, що містить список імен файлів для розбору. Також у vim, за замовчуванням, не встановлено ключових прив'язок - потрібно запустити :cscope blah blahвручну.

Для вирішення проблеми з кулаком у мене є скрипт, cscope_gen.shякий виглядає так:

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

Цей пошук коду, який мене цікавить, створює список cscope.files та створює базу даних. Таким чином я можу запустити ":! Cscope_gen.sh", а не запам'ятовувати всі налаштовані кроки.

Я за допомогою цього фрагмента картографую пошук cscope в ctrl-space x 2, який пом'якшує інший спад моменту:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

Є цей плагін cscope_maps.vim, який встановлює купу подібних прив'язок. Я ніколи не пам'ятаю, що означають усі варіанти, тому прагнуть дотримуватися ctrl-space.

Отже, щоб зробити висновок: каталоги легше налаштовувати і в основному працюють, не роблячи іншого, це також важливо і для omni-Complete. cscope надає більше можливостей, якщо вам доведеться підтримувати велику і здебільшого невідому кодову базу, але вимагає більше роботи з ногами.


2
Чи є спосіб зробити теги точнішими? Я був make tagsу кореневому режимі ядра і грав зі стрибками, і більшу частину часу опинився в неправильному місці. Я читав, що у ctags є проблеми з препроцесором c, але враховуючи, що ctags використовуються в lxr, очевидно, що щось можна зробити.
Роберт С. Барнс

2
Якщо є глибокий макро-вуду, то, швидше за все, каталоги не вдасться :-( я використовую його в основному для матеріалів C ++, які менше покладаються на цю сторону речей (хоча у цього є свої проблеми ...)
richq

12
set cscopetag( cst), щоб змусити спочатку шукати команди :tagта CTRL-]команди через скат, а потім теги
Hasturkun

1
Крім того, ctags досить повільний при рекурсивному пошуку, використання "ctags -L cscope.files" значно пришвидшить генерацію ваших тегів.
Аарон Х.

1
@ RobertS.Barnes використовує якесь рішення g C-], vim покаже вам список тегів, що відповідають імені. Вам все одно потрібно буде знайти вручну відповідне визначення, яке ви шукаєте.
Хуберт Каріо

15

Я був у тій же ситуації кілька місяців тому ...

Недостатня точність ctags - це біль у .., і я знаходжу cscope набагато краще для всіх матеріалів, пов’язаних з макросами (а в ядрі Linux є купа макросів) ..

що стосується використання, це насправді просто ... ви просто набираєте cscope -R в корені ядра, і тоді вам нічого не турбуватися .. (я маю на увазі, якщо ви просто хочете вивчити, що ідеально ...)

Тоді всі ключові прив’язки базуються на Ctrl- \ (ви можете їх перезавантажити, якщо у вас алергія на Ctrl), ви в основному використовуєте s та g ....,

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

У будь-якому випадку, піти на скаскоп, це набагато зручніше, точніше.


4
<< Ви просто введіть cscope -R в корені вашого ядра .... Краще введіть "make cscope" під ядром, інакше ви отримаєте всі архітектури, наявні в ядрі Linux, і, отже, множинне визначення того ж символу C.
кумар

4

Хм ... Мабуть, ви повинні використовувати етаги замість ctags ...

Якщо ви використовуєте cscope, то ви можете бачити ланцюги викликів, тобто хто викликає цю функцію, і які функції викликає ця функція?

Я не впевнений, чи можна це зробити за допомогою етагів / ctags ...

Це лише одна особливість ... а як дізнатися файл, який містить певне визначення функції? Це ви отримуєте лише вскопічно.

Я використовую як cscope, так і етаги, вони обидва хороші для різних речей, особливо при роботі з великою базою кодів, наприклад, ядром Linux. Насправді я почав використовувати cscope та etags, коли почав працювати з Linux Kernel / Xen.

LXR не великий, тому що вам потрібно натискати, переходити по мережі тощо, тоді як ви можете будувати бази даних cscope та тегів на вашому коді ядра, і не потрібно переходити по мережі (на відміну від lxr).


Це не етаги лише для emacs? Я використовую виключно g / vim.
Роберт С. Барнс

Так, ти маєш рацію. На сторінці man: Програма etags використовується для створення файлу таблиці тегів у форматі, зрозумілому emacs (1); програма ctags використовується для створення подібної таблиці у форматі, зрозумілому vi (1).
rmk

1
я думаю, є два аромати етагів та ctags. Один - це emacs один, інший - насичений ctags. Перший був спочатку написаний для emacs, але може бути використаний і для vi; другий був спочатку написаний для vi, але його можна використовувати і для emacs. Я вважаю, що другий (насичений ctags) простіший у використанні, хоча я користувач emacs. Якщо ви встановите пакет exuberant-ctags, посилання на бінарні файли etags / ctags зміниться та вкажуть на різні бінарні файли.
ustun

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.