2010-11-24 42 views
5

Existe-t-il un moyen d'obtenir la commande Emacs tags-search pour collecter tous les résultats de recherche dans un tampon? Quelque chose comme la façon dont les résultats de 'grep' et 'tags-apropos' sont collectés dans un tampon de compilation? Utiliser M-, pour parcourir les résultats n'est pas très efficace s'il y a un grand nombre de résultats, donc ce serait génial s'il y avait un moyen de parcourir et de chercher dans les résultats dans un tampon.Existe-t-il un moyen d'obtenir la commande emacs tag-search pour afficher tous les résultats dans un buffer?

Merci,

Benj

+0

Copie possible de [Aide à l'écriture emacs lisp pour emacs etags search] (http://stackoverflow.com/questions/4474583/help-writing-emacs-lisp-for-emacs-etags-search), consultez quelques-unes des les solutions là-bas. –

Répondre

4

Essayez etags-select

+0

Ah c'est cool, je ne savais pas à ce sujet. Cependant, 'tags-search' recherche une regexp dans tous les fichiers listés dans vos tables de tags chargés (par opposition à la recherche de tags, ce que semble faire etags-select).Je pourrais être en mesure de pirater quelque chose cependant. –

+0

Installez le paquet 'etags-select' et vous pouvez utiliser les fonctions' etags-select-find-tag-at'' et 'etags-select-find-tag' – PlagueHammer

0

j'ai mal interprété votre question dans ma première réponse. Voici quelque chose qui fonctionne, mais qui est un peu mauvais car il utilise des appels synchrones pour grep, donc tout bloque pendant que ça marche. Des améliorations sont à titre d'exercice au lecteur:

(require 'etags) 
(require 'grep) 

(defun tags-search-sel (regexp) 
    "Search through all files listed in tags table for match for REGEXP. 
Show all matches at once." 
    (interactive "sTags search (regexp): ") 
    ;; Get all unique filenames in TAGS files. 
    (let ((keep-going t) files) 
    (when (visit-tags-table-buffer) 
     (while keep-going 
     (save-excursion 
      (goto-char (point-min)) 
      (while (re-search-forward "\f\n\\([^\n]+\\),[0-9]*\n" nil t) 
      (add-to-list 'files 
         (expand-file-name 
          (buffer-substring (match-beginning 1) (match-end 1)) 
          (file-truename default-directory))))) 
     (setq keep-going (visit-tags-table-buffer t)))) 
    ;; grep through every file for regexp 
    (when files 
     (grep-compute-defaults) 
     (let ((outbuf (get-buffer-create "*tags-search-sel*"))) 
     (with-current-buffer outbuf 
      (setq buffer-read-only nil) 
      (erase-buffer) 
      (insert "Searching for '" regexp "' in tags files ...\n\n") 
      (dolist (file files) 
      (call-process-shell-command (concat grep-command regexp " " file) nil t)) 
      (grep-mode) 
      (setq overlay-arrow-position nil) 
      (set-buffer-modified-p nil) 
      (setq buffer-read-only t) 
      (goto-char (point-min))) 
     (pop-to-buffer outbuf))))) 
0

Voir icicle-tags-search. Il vous permet de rechercher tous les fichiers source répertoriés dans les tables de balises pour les correspondances pour une expression rationnelle donnée.

Vous voyez toutes les correspondances de l'expression rationnelle dans les fichiers de code source, comme les résultats de recherche à visiter. Toutes les balises d'un fichier de balises donné sont utilisées, y compris les balises dupliquées provenant des mêmes fichiers sources ou de fichiers source différents.

Par défaut, tous les fichiers de tags sont utilisés, mais si vous fournissez un préfixe , seule la table de variables actuelle est utilisée.

Rechercher des correspondances, avec complétion, recyclage et remplacement de recherche.

Après avoir spécifié l'expression rationnelle qui définit à l'intérieur pour correspondre à les contextes des contextes de recherche, input type (par exemple regexp ou autre motif). Les contextes correspondant à votre entrée sont disponibles en tant que candidats . Vous pouvez utiliser S-SPC pour affiner davantage les candidats, en tapant des modèles supplémentaires pour correspondre.

Par défaut, les candidats sont classés par ordre d'occurrence de tampon, mais vous pouvez les trier de différentes manières en utilisant C-,.

Vous pouvez également choisir de rechercher, pas les contextes de recherche comme définis par le regexp contexte que vous fournissez, mais les non contextes, que est, le texte dans les fichiers qui ne pas correspondre à la regexp. Pour ce faire, utiliser C-M-~ pendant l'achèvement. (Ceci est une bascule, et elle n'affecte que les commandes de recherche futures , et non la commande actuelle.)

Voir le doc pour la commande icicle-search pour plus d'informations.

+0

Peu importe: Vous voulez expliquer pourquoi vous avez downvoted cette réponse? – Drew