Как программно создать / обновить файл TAGS с помощью emacs? - PullRequest
18 голосов
/ 14 февраля 2009

Существует ли плагин для emacs для автоматического обновления файла TAGS в моем проекте C (например, при сохранении или доступе к буферу) или создания нового, если файл TAGS отсутствует?

Я работаю в Windows (без Cygwin), поэтому все необычные сценарии оболочки не помогают. Я надеялся, что нативное решение emacs не использует никаких внешних скриптов.

Я уже пробовал build-tags.el и etags-table.el , но ни один из них действительно не работал (так, как я хотел).

Есть еще идеи?

Ответы [ 7 ]

9 голосов
/ 23 апреля 2010

etags-update может помочь в вашем случае. Я не проверял это, но согласно readme:

etags-update.el - глобальный второстепенный режим Emacs, который обновляет ваши теги при сохранении файла.

Я нашел его на странице Emacswiki для создания файлов TAGS

9 голосов
/ 14 февраля 2009

Вот как я генерирую файл TAGS для проекта C:

  1. M-x cd YOUR_DIRECTORY
  2. M-x compile
  3. найти. -name "*. [chCH]" -print | Этагс -

Это создаст файл TAGS в текущем каталоге для всех подкаталогов и файлов.

Вот функция emacs, которая делает то же самое:

(defun compile-tags ()
  "compile etags for the current project"
  (interactive)
  (cd "YOUR_DIRECTORY")
  (compile "find . -name \"*.[chCH]\" -print | etags -"))

ПРИМЕЧАНИЕ: если вы находитесь в Windows, вам нужно установить Cygwin и убедиться, что c:\cygwin\bin находится на вашем пути, чтобы вы получили find на своем пути. Также убедитесь, что каталог emacs bin находится в вашем пути, чтобы вы также могли получить etags.

4 голосов
/ 14 февраля 2009

Почему бы не добавить выполнение ctags в ваш скрипт сборки? Вам действительно нужен только новый файл тегов, когда вы компилируете (самое большее). Я обычно пишу запланированное задание для создания файла тегов каждую ночь. Кажется, работает довольно хорошо.

2 голосов
/ 18 июня 2011

Попробуйте мой модуль `ctags.el '[1].

Пример конфигурации:

(setq tags-revert-without-query t)
(global-set-key (kbd "<f5>") 'ctags-create-or-update-tags-table)

Затем просто нажмите <f5>, чтобы обновить или создать файл TAGS. Эта функция ищите файл TAGS в текущем и его родительских каталогах, если TAG файл не найден, он спросит вас, где создать новый.

Это новая библиотека, возможно, в ней есть ошибки и т. Д., Поэтому любая помощь приветствуется.

[1] https://bitbucket.org/semente/ctags.el/

2 голосов
/ 14 февраля 2009

Я использую комбинацию semantic + gnu global для своей повседневной работы. Базы данных GNU Global обновляются один раз в день, в то время как семантические функции используют их для базовой навигации и повторного анализа измененных файлов на лету.

Вы можете найти больше об этих пакетах в моей статье о Cedet

1 голос
/ 29 июня 2016

Установите find-and-ctags (https://github.com/redguardtoo/find-and-ctags),, затем вставьте следующий код в ~ / .emacs,

(defun my-setup-develop-environment ()
  (interactive)

  ;; you can use `find-and-ctags-current-full-filename-match-pattern-p' instead
  (when (find-and-ctags-current-path-match-pattern-p "/MYPROJ")
    (setq-local tags-table-list
                (list (find-and-ctags-run-ctags-if-needed "~/workspace/MYPROJ" ; project directory
               '(("-not -size +64k" "--exclude=*.min.js") ; (find-opts ctags-opts)
                                                            ;; you may add more find-opts ctags-opts pair HERE to run find&ctags again to APPEND to same TAGS file
                                                            ;; ctags-opts must contain "-a" to append
                                                            ;; (find-opts "-a")
                                                            )))))

  ;; for other projects
  ;; insert NEW `when' statements here
  )
(add-hook 'prog-mode-hook 'my-setup-develop-environment) ; prog-mode require emacs24+
(add-hook 'lua-mode-hook 'my-setup-develop-environment) ; lua-mode does NOT inherit from prog-mode

;; OPTIONAL
(add-hook 'after-save-hook 'find-and-ctags-auto-update-tags)

Работает на окнах, все что вам нужно, это заменить "~ / workspace / MYPROJ" на "C: / workspace / MYPROJ". Исполняемый файл CTags может быть любой версии, поскольку созданный TAGS содержит только относительный путь.

1 голос
/ 14 февраля 2009

Это может приблизить вас (не проверено):

(defvar my-auto-update-tags-alist
  (list '("/some/path/to/TAGS" "command_to_build_tags")
        '("/another/path/to/TAGS" "another_build_command")))

(defun my-auto-update-tags ()
  "Automatically update TAGS files"
  (tags-table-check-computed-list)
  (let ((filename (buffer-file-name))
        build-cmd)
    (mapc (lambda (tag-file)
            (set-buffer tag-file)
            (when (member filename (tags-table-files))
              (setq build-cmd (cdr (assoc tag-file my-auto-update-tags-alist)))
              (when build-cmd
                (call-process build-cmd nil 0))))
          tags-table-computed-list)))

(add-hook 'after-save-hook 'my-auto-update-tags)

Он будет работать (я упоминал, что он не тестировался?) Только для файлов, которые уже находятся в файлах TAGS. Если вы добавите новый файл, вам придется заново создать файл TAGS самостоятельно. Часть обработки вызовов должна работать асинхронно, поэтому может пройти несколько секунд, пока файл TAGS не будет фактически перестроен (если это даже работает;)

...