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 надає більше можливостей, якщо вам доведеться підтримувати велику і здебільшого невідому кодову базу, але вимагає більше роботи з ногами.
make tags
у кореневому режимі ядра і грав зі стрибками, і більшу частину часу опинився в неправильному місці. Я читав, що у ctags є проблеми з препроцесором c, але враховуючи, що ctags використовуються в lxr, очевидно, що щось можна зробити.