2010-11-25 16 views
4

Ich bin neu in Emacs Lisp-Programmierung. Ich bin ein Entwickler und Programmierer in c auf täglicher Basis. Ich möchte Tags zum Code-Browsing mit Emacs verwenden. Allerdings ist die Größe meines Projekts sehr groß und ich kann es mir nicht leisten, etags zu laufen. Ich möchte lisp Funktion oder Code in Emacs so hinzufügen, jede Datei, die ich öffne emacs muss in eine Datei geschrieben (nennen Sie es als ~/project_files_opened.txt) und ich werde Cron Job, der nur die geöffneten Dateien Etags. Kann mir bitte jemand mit einigen Referenzen oder bestehendem Code helfen? Sogar einige Beispiele würden mir helfen, ... Danke.emacs Lisp-Code zum Hinzufügen von Dateien zur Überwachung

Antwort

1

Wie wärs mit einem etwas anderen Takt? Wenn Sie eine Datei öffnen (die Ihnen wichtig ist), fügen Sie sie zu diesem Zeitpunkt der TAGS-Datei hinzu. Sie können mit dem folgenden Code, das ist ziemlich leicht tun:

(setq tags-file-name "/scratch2/TAGS") 
(setq tags-revert-without-query t) 
(add-hook 'find-file-hooks 'add-opened-file-to-tags) 
(defun add-opened-file-to-tags() 
    "every time a file is opened, add it to the TAGS file (if not already present) 
Note: only add it to the TAGS file when the major mode is one we care about" 
    (when (memq major-mode '(c-mode c++-mode)) 
(let ((opened-file (buffer-file-name))) 
    (save-excursion 
    (visit-tags-table-buffer) 
    (unless (member opened-file (tags-table-files)) 
     (shell-command 
      (format "etags -a --output %s %s" tags-file-name opened-file))))))) 
;; create an empty TAGS file if necessary 
(unless (file-exists-p tags-file-name) 
    (shell-command (format "touch %s" tags-file-name))) 

jeder einmal in eine Weile Sie die TAGS Datei gelöscht werden soll, um den Inhalt zu aktualisieren. Oder Sie können so etwas wie die folgenden M-x Refresh-Tags-Tabelle verwenden:

(defun refresh-tags-file() 
    "rebuild the tags file" 
    (interactive) 
    (let ((tags-files 
    (save-excursion 
     (visit-tags-table-buffer) 
     (tags-table-files)))) 
(delete-file tags-file-name) 
(dolist (file tags-files) 
    (shell-command (format "etags -a --output %s %s" tags-file-name file))))) 
0

Sie können sich das CEDET-Framework ansehen. Siehe die semantic module.

+0

Das * könnte * sein der Weg zu gehen, aber es ist ziemlich schwer. –

1

Möglicherweise möchten Sie GNU Global als Ersatz für Etags betrachten. Mein Vorbehalt ist, dass ich es selbst nicht verwendet habe, aber ich glaube, dass es eine richtige Datenbank im Gegensatz zu der grundlegenden flachen TAGS-Datei implementiert, und dass inkrementelle Updates daher sehr effizient sein sollten.

Siehe die tutorial für Details; insbesondere 3.6 Extended Emacs using GLOBAL und 4.3 Incremental updating.

Es gibt auch eine Seite im Emacs Wiki:
http://www.emacswiki.org/emacs/GnuGlobal

Verwandte Themen