2009-02-14 22 views
18

¿Hay algún complemento para que emacs actualice automáticamente el archivo TAGS en mi proyecto C (por ejemplo, en almacenamiento o acceso al búfer) o cree uno nuevo si no hay un archivo TAGS presente?¿Cómo crear/actualizar mediante programación un archivo TAGS con emacs?

Funciono 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ó (como yo quería).

¿Alguna otra idea?

Respuesta

4

¿Por qué no agregar una ejecución de ctags a su script de compilació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.

+3

Quiero que el archivo TAGS se actualice tan pronto como se introduzcan nuevos símbolos en la fuente. Utilizo ampliamente las capacidades de navegación de TAGS al desarrollar para saltar de un archivo a otro. Una vez por noche no es suficiente. Los mods de script de compilación personal no son posibles en nuestro entorno multi desarrollador. – cschol

+0

¿Cómo construyes tu código? Envuelva ese comando con un script que haga la compilación, luego ejecuta el comando ctags. –

+3

No estoy de acuerdo: desea etiquetas inmediatamente después de editar el búfer. – jrockway

2

Uso la 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 my article about Cedet

9

Aquí es cómo generar un archivo de etiquetas para un proyecto de C:

  1. M-x cd YOUR_DIRECTORY
  2. M-x compilar
  3. hallazgo. -name "*. [chCH]" -print | etags -

Eso creará un archivo TAGS en el directorio actual para todos los subdirectorios y archivos.

Aquí es una función 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 se encuentra en las ventanas que necesita para instalar cygwin y asegúrese c:\cygwin\bin es en su camino para que usted obtenga find en tu camino También asegúrese de que el directorio emacs bin esté en su ruta para que pueda obtener etags también.

+2

También puede usar la versión nativa de Windows de gnu utils incluyendo find y así sucesivamente. Los encuentro más rápidos que cygwin. http://gnuwin32.sourceforge.net/ – justinhj

1

Esto podría obtener cerca (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) 

Sólo funcionará (¿He mencionado que es no probado?) De los archivos que se encuentran en los archivos de etiqueta ya. Si agrega un nuevo archivo, tendrá que volver a generar el archivo TAGS la primera vez. La parte del proceso de llamada debe funcionar de forma asíncrona, por lo que pueden pasar unos instantes hasta que el archivo TAGS se reconstruya (si funciona);

+2

¿Harías un esfuerzo para probarlo? –

2

probar mi `ctags.el '[1] módulo.

Ejemplo de configuración:

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

A continuación, basta con pulsar <f5> para actualizar o crear su archivo ETIQUETAS. 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 nueva biblioteca y probablemente tiene errores, etc., por lo que cualquier ayuda es bienvenida.

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

1

Instalación de buscar y ctags (https://github.com/redguardtoo/find-and-ctags), a continuación, insertar a continuación el código 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.

+1

Esto es algo similar a mi enfoque, creo. ¿Estás reemplazando por la fuerza el archivo TAGS existente cada vez? Si es así, puedes mejorarlo comparando el archivo TAGS antiguo y el nuevo después de la generación, y solo criticarlo si difieren, para que Emacs no vea un cambio. Además, puede decidir si molestar a la generación de etiquetas ejecutando un 'find' inicial usando los mismos criterios pero también' -newer' que el archivo TAGS actual. Si no hay un archivo más nuevo, no hagas nada. Canalizo el comando '-newer' a través de' head -1' para que se cancele tan pronto como encuentre un único archivo coincidente. – phils

+0

Sí, cambio forzosamente TAGS cada vez. Mi proyecto es un proyecto web frontend. "-newer" es una buena idea. Definitivamente lo intentare. ¿Me podría mostrar alguna muestra de código? –

Cuestiones relacionadas