2009-02-14 8 views
18

C'è qualche plugin per emacs per aggiornare automaticamente il file TAG nel mio progetto C (ad esempio sul salvataggio del buffer o accesso) o crearne uno nuovo se non ci sono file TAGS presenti?Come creare/aggiornare a livello di codice un file TAGS con emacs?

Sono in esecuzione su Windows (senza Cygwin), quindi tutto lo script di shell di fantasia non aiuta. Speravo in una soluzione nativa di emacs che non usasse script esterni.

Ho già provato build-tags.el e etags-table.el ma nessuno di questi ha funzionato davvero (nel modo in cui volevo).

Altre idee?

risposta

4

Perché non aggiungere un'esecuzione di ctags allo script di build? Hai davvero bisogno solo di un nuovo file di tag quando compili (al massimo). Tendo a scrivere solo un'attività pianificata per creare il file dei tag ogni notte. Sembra funzionare abbastanza bene.

+3

Desidero che il file TAGS sia aggiornato non appena vengono introdotti nuovi simboli nella sorgente. Uso estensivamente le funzionalità di esplorazione TAGS durante lo sviluppo per passare da un file all'altro. Una volta una notte non è abbastanza spesso. Mods di script di build personali non sono possibili nel nostro ambiente multi-sviluppatore. – cschol

+0

Come costruisci il tuo codice? Avvia il comando con uno script che crea la build, quindi esegue il comando ctags. –

+3

Non sono d'accordo: vuoi tag subito dopo aver modificato il buffer. – jrockway

2

Uso la combinazione di semantic + gnu globale per il mio lavoro quotidiano. I database di GNU Global vengono aggiornati una volta al giorno, mentre quelli semantici li usano per la navigazione di base e riesaminano al volo i file modificati.

È possibile trovare maggiori informazioni su questi pacchetti in my article about Cedet

9

Ecco come ho generare un file tag per un progetto C:

  1. M-x cd YOUR_DIRECTORY
  2. M-x compilare
  3. ritrovamento. -nome "*. [chCH]" -print | etags -

Ciò creerà un file TAGS nella directory corrente per tutte le sottodirectory e i file.

Ecco una funzione Emacs che fa la stessa identica cosa:

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

NOTA: se siete su Windows è necessario installare Cygwin e assicurarsi c:\cygwin\bin si trova nel percorso in modo da ottenere find nel tuo percorso. Assicurati inoltre che la directory bin di emacs sia nel tuo percorso in modo da poter ottenere anche etags.

+2

Puoi anche usare la versione nativa di gnu utils incluso find e così via. Li trovo più veloci di cygwin. http://gnuwin32.sourceforge.net/ – justinhj

1

Questo potrebbe ottenere si chiude (non testata):

(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) 

Funzionerà solo (mi ha fatto ricordare che è testato?) Sul file che si trovano nei file TAGS già. Se si aggiunge un nuovo file, è necessario rigenerare il file TAGS la prima volta da soli. La parte del processo di chiamata dovrebbe funzionare in modo asincrono, quindi potrebbe essere qualche istante prima che il file TAGS venga effettivamente ricostruito (se funziona anche questo)

+2

Faresti uno sforzo per testarlo? –

2

Prova il mio [1] modulo `ctags.el '.

Esempio di configurazione:

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

Poi basta premere <f5> per aggiornare o creare il file di tag. Quella funzione cerca un file TAG nella directory corrente e nelle sue directory madri, se non viene trovato un file TAG , ti chiede dove crearne uno nuovo.

È una nuova libreria e probabilmente ha bug, ecc. Quindi qualsiasi aiuto è benvenuto.

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

1

Installare trovare-e-ctags (https://github.com/redguardtoo/find-and-ctags), quindi inserire il codice di seguito in ~/.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) 

Funziona su Windows, è sufficiente disporre di sostituire " ~/workspace/MYPROJ "con" C:/workspace/MYPROJ ". L'eseguibile CTags può essere qualsiasi versione, perché il TAG prodotto contiene solo un percorso relativo.

+1

Questo è in qualche modo simile al mio approccio, penso. Sostituisci con la forza il file TAGS esistente ogni volta? In tal caso, puoi migliorarlo confrontando il vecchio e il nuovo file TAGS dopo la generazione e limitandoti a scombussolare se differiscono, in modo che Emacs non veda una modifica. Inoltre puoi decidere se disturbare la generazione di tag eseguendo un 'find' iniziale usando gli stessi criteri ma anche' -newer' rispetto al file TAGS corrente. Se non ci sono file più recenti, non fare nulla. Conduco il comando '-newer' con' head -1' in modo che si interrompa non appena trova un singolo file corrispondente. – phils

+0

Sì, cambio continuamente TAGS ogni volta. Il mio progetto è un progetto di frontend web. "-nuovo" è una buona idea. Lo proverò sicuramente. Potresti mostrarmi qualche esempio di codice? –

Problemi correlati