¿Cómo crear/actualizar mediante programación un archivo TAGS con emacs?
ctags (7)
¿Hay algún complemento para que emacs actualice automáticamente el archivo TAGS en mi proyecto C (por ejemplo, en guardar o acceder al búfer) o crear uno nuevo si no hay un archivo TAGS presente?
Me estoy ejecutando en Windows (sin Cygwin), por lo que todo el sofisticado scripting de shell no ayuda. Esperaba una solución nativa de emacs que no utilizara scripts externos.
Ya probé build-tags.el y etags-table.el pero ninguno de estos realmente funcionó (de la manera que yo quería).
¿Alguna otra idea?
Esto podría acercarlo (no probado):
(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)
Solo funcionará (¿mencioné que no se ha probado?) En archivos que ya están en los archivos de TAGS. Si agrega un nuevo archivo, tendrá que volver a generar el archivo TAGS la primera vez. La parte del proceso de llamada debería funcionar de forma asíncrona, por lo que podrían pasar unos minutos hasta que el archivo TAGS se haya reconstruido (si esto funciona);
¿Por qué no agregar una ejecución de ctags a su script de construcción? Solo necesita un nuevo archivo de etiquetas cuando compila (como máximo). Tiendo a escribir una tarea programada para construir el archivo de etiquetas todas las noches. Parece funcionar bastante bien.
Utilizo una combinación de semántica + gnu global para mi trabajo diario. Las bases de datos de GNU Global se actualizan una vez al día, mientras que las semánticas las utilizan para la navegación básica y vuelven a analizar los archivos modificados sobre la marcha.
Puede encontrar más información sobre estos paquetes en mi artículo sobre Cedet
Pruebe mi módulo `ctags.el ''[1].
Ejemplo de configuración:
(setq tags-revert-without-query t)
(global-set-key (kbd "<f5>") ''ctags-create-or-update-tags-table)
Luego solo presione <f5>
para actualizar o crear su archivo TAGS. Esa función busca un archivo TAGS en el directorio actual y sus directorios principales, si no se encuentra un archivo TAG, le preguntará dónde crear uno nuevo.
Es una biblioteca nueva y probablemente tiene errores, etc., por lo que cualquier ayuda es bienvenida.
etags-update puede ayudar en su caso. No lo probé, pero de acuerdo con el archivo Léame:
etags-update.el es un modo menor global de Emacs que actualiza tus ETIQUETAS al guardar un archivo.
Lo encontré en la página de Emacswiki para compilar archivos TAGS
Aquí es cómo genero un archivo TAGS para un proyecto C:
- Mx cd YOUR_DIRECTORY
- Mx compilar
- encontrar . -name "*. [chCH]" -print | etags -
Eso creará un archivo TAGS en el directorio actual para todos los subdirectorios y archivos.
Aquí hay una función de emacs que hace exactamente lo mismo:
(defun compile-tags ()
"compile etags for the current project"
(interactive)
(cd "YOUR_DIRECTORY")
(compile "find . -name /"*.[chCH]/" -print | etags -"))
NOTA: si está en Windows necesitará instalar cygwin y asegurarse de que c:/cygwin/bin
esté en su ruta para que find
en su camino. También asegúrese de que el directorio emacs bin esté en su ruta para que pueda obtener también etags
.
Instale find-and-ctags ( https://github.com/redguardtoo/find-and-ctags ), luego inserte el código siguiente en ~ / .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)
Funciona en Windows, todo lo que necesita es reemplazar "~ / workspace / MYPROJ" con "C: / workspace / MYPROJ". CTags ejecutable podría ser cualquier versión, porque TAGS producido contiene solo una ruta relativa.