Подтвердить что ты не робот

Как программно создавать/обновлять файл TAGS с помощью emacs?

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

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

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

Любые другие идеи?

4b9b3361

Ответ 1

Вот как я создаю файл TAGS для проекта C:

  • M-x cd YOUR_DIRECTORY
  • Компиляция M-x
  • найти. -name "*. [chCH]" -print | etags -

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Подробнее об этих пакетах можно узнать в моей статье о Cedet

Ответ 5

Попробуйте мой модуль `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/

Ответ 6

Это может помочь вам закрыть (непроверенный):

(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 не будет фактически восстановлен (если это даже работает;)

Ответ 7

Установите 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 содержат только относительный путь.