Теги в emacs с большой кодовой базой

Мне было интересно, как люди используют теги в emacs при работе с большой базой кода (около 50000 cpp |.h |.cs файлов). Некоторые из моих коллег используют инструменты индексирования (имена escape me), которые возвращают все результаты по кодовой базе за секунды. Похоже, что я не могу приблизиться к такой производительности на emacs и тегах, но это по сути то же самое!

Некоторые подходы, которые я пробовал:

  • Создайте один файл TAGS для всего репозитория. Обычно это довольно большой и обычно неудобно использовать (иногда слишком много тегов совпадают).
  • Создайте отдельные файлы TAGS для cpp | h | cs. Немного более сфокусированный, если я знаю (грубо (по крайней мере, язык программирования, который будет использоваться)), что я, по-вашему, ищу.
  • Меньшие файлы тегов в разделе репозитория. Это здорово, когда я уверен в этой области, но накладные расходы на управление - это боль. Я обычно генерирую их по мере необходимости.

Приветствуются любые предложения\примеры вашего рабочего процесса.

Ответы

Ответ 1

Вот script Я использую:

#!/usr/bin/bash
echo "Creating list of files to build tags..."
find `pwd` -name '*.c' -o -name '*.h' > cscope_files

echo "Building cscope and ctags databases..."
cscope -bqki cscope_files
ctags -eL cscope_files

> cat cscope_files | wc -l
10700

Для 10700 файлов, сопоставимых с вашим проектом, переходы между тегами мгновенно. Как вы могли заметить, это создает базы данных cscope и etags. Я запускаю этот script в верхней части дерева. Также, если это поможет, это ключевые привязки в моем файле .emacs.el.

(defun hide-cscope-buffer ()
  "Turn off the display of cscope buffer"
   (interactive)
   (if (not cscope-display-cscope-buffer)
       (progn
         (set-variable 'cscope-display-cscope-buffer t)
         (message "Turning ON display of cscope results buffer."))
     (set-variable 'cscope-display-cscope-buffer nil)
     (message "Toggling OFF display of cscope results buffer.")))


(global-set-key [f9] 'cscope-find-this-symbol)
(global-set-key [f10] 'cscope-find-global-definition-no-prompting)
(global-set-key [f11] 'cscope-find-functions-calling-this-function)
(global-set-key [f12] 'cscope-find-this-file)
(global-set-key (kbd "C-t") 'cscope-pop-mark)
(global-set-key (kbd "C-n") 'cscope-next-symbol)
(global-set-key (kbd "C-p") 'cscope-prev-symbol)
(global-set-key (kbd "C-b") 'hide-cscope-buffer)
(global-set-key [S-f7] 'cscope-next-file)
(global-set-key [S-f8] 'cscope-prev-file)
(global-set-key [S-f9] 'cscope-find-this-text-string)
(global-set-key [S-f10] 'cscope-find-global-definition)
(global-set-key [S-f11] 'cscope-find-egrep-pattern)                                                                                                                           
(global-set-key [S-f12] 'cscope-find-files-including-file)

Я не обычный пользователь emacs. Они были использованы мной, когда я пытался переключиться на emacs, но затем вернулась в vim, где я нашел способы сделать все, что мне было приятно делать в emacs.

Обновление:. Для нескольких файлов тегов в иерархии каталогов см. раздел "Несколько тегов" этой статьи article.

Ответ 3

Возможно, вам стоит взглянуть на GNU Global. Он поддерживает C и С++ (вместе с Yacc, Java, PHP4 и сборкой), поэтому он может хорошо работать для С# (я не написал ни одного С#, поэтому я мог бы также говорить полный вздор).

Если он работает, он должен быть значительно быстрее обычного файла TAGS.

Ответ 4

Как уже упоминалось, GNU Global довольно хороша. Здесь краткое введение для использования его из emacs.

Обратите внимание, что если ваш проект действительно 50K файлов (и 50K locs), первый запуск (для индексации всего этого материала) может быть немного медленным.