Da ich so ein Fan von igrep
bin, würde ich es als Baustein verwenden. Von dort sind es zwei einfache Routinen und du bist fertig.Mit dieser Bibliothek und diese beiden Funktionen, alles, was Sie tun müssen, ist:
M-x igrep-tags ^SomeRegexp.*Here RET
Hier ist der Code:
(require 'igrep)
(defun igrep-tags (regex)
(interactive "sTAGS Regexp: ")
(igrep igrep-program regex (tags-file-names)))
(defun tags-file-names()
(save-excursion
(visit-tags-table-buffer)
(mapcar (lambda (f) (file-truename f))
(tags-table-files))))
Und weil die Liste der Dateien kann wirklich lange, und Sie wahrscheinlich don‘ t egal, was diese Liste ist, können Sie diese beiden Teile des Codes hinzufügen, die die Dateinamen unsichtbar machen, nachdem der grep beendet hat:
(add-hook 'compilation-finish-functions 'igrep-tags-hide-filenames)
(defun igrep-tags-hide-filenames (buffer stat)
"hide the filenames b/c they can get long"
(save-excursion
(set-buffer buffer)
(save-match-data
(goto-char (point-min))
(if (search-forward (combine-and-quote-strings (tags-file-names))
nil
(save-excursion (forward-line 10) (point)))
(let ((display-string "..<files from TAGS>.."))
(put-text-property (match-beginning 0) (match-end 0) 'invisible t)
(put-text-property (match-beginning 0) (match-end 0) 'display display-string))))))
die wirklich lange Befehlszeile zu vermeiden, können Sie den folgenden Code verwenden (die alle die Namen der Dateien aus TAGS-Datei erstellt eine temporäre Datei enthält, und verwendet diese anstelle):
(defun igrep-tags (regex)
(interactive "sTAGS Regexp: ")
(let ((igrep-find t)
(igrep-use-file-as-containing-files t))
(igrep igrep-program regex nil)))
(defvar igrep-use-file-as-containing-files nil)
(defadvice igrep-format-find-command (around igrep-format-find-command-use-filename-instead activate)
"use the second argument as a file containing filenames"
(if igrep-use-file-as-containing-files
(progn (with-temp-file
(setq igrep-use-file-as-containing-files (make-temp-file "tags-files"))
(insert (combine-and-quote-strings (tags-file-names))))
(setq ad-return-value (format "cat %s | xargs -e %s"
igrep-use-file-as-containing-files
(ad-get-arg 0))))
ad-do-it))
Und für diejenigen, Emacs mit 22 oder früher, werden Sie die Routine benötigen, die mit Emacs 23 (von subr.el versendet hat)
(defun combine-and-quote-strings (strings &optional separator)
"Concatenate the STRINGS, adding the SEPARATOR (default \" \").
This tries to quote the strings to avoid ambiguity such that
(split-string-and-unquote (combine-and-quote-strings strs)) == strs
Only some SEPARATORs will work properly."
(let* ((sep (or separator " "))
(re (concat "[\\\"]" "\\|" (regexp-quote sep))))
(mapconcat
(lambda (str)
(if (string-match re str)
(concat "\"" (replace-regexp-in-string "[\\\"]" "\\\\\\&" str) "\"")
str))
strings sep)))
als nur zur Seite, an der Lisp Schleife Makro aussehen (einige Beispiele hier http: // www. ai.sri.com/pkarp/loop.html) Ich denke du wirst es mögen. – ocodo