J'utilise Emacs depuis un certain temps et je n'arrive toujours pas à comprendre quelle est la meilleure façon de greper (récursivement) une chaîne dans un répertoire (projet) et d'obtenir les résultats présentés soit sous forme de tampon dired, soit dans certains encore plus manière utile. Veuillez m'éclairer.
14
helm-projectile-grep
commande (si vous avez installé un projectile de barre) ouprojectile-grep
?helm
ouprojectile
est, mais si elle est un outil recommandé, j'installerait et apprendre.projectile-grep
. En outre, je vous recommande fortement d'installer lehelm
package. Je ne peux pas imaginer exécuter emacs sanshelm
ethelm-projectile
. Vous pourriez également être intéressant dans lehelm-ag
package (qui fournit une interface de barre pour le chercheur d'argent dans emacs, qui est censé être plus rapide que grep ou ack).M-x grep
ne fait pas ce dont vous avez besoin. Cela vous permet de donner une ligne de commande arbitraire, je l'utilise parfoisfind
lorsque j'ai besoin de la récursivité.Réponses:
Eh bien, puisque la question d'origine ne mentionne pas
rgrep
, je vais aller de l'avant et le signaler ici. C'est l'option la plus simple déjà intégrée à Emacs, et je l'ai trouvée plus que suffisante pour la plupart des choses.De la documentation,
La recherche est limitée aux noms de fichiers correspondant au fichier shell.
Ainsi, par exemple, pour rechercher tous les fichiers python sous mon répertoire pour des utilisations de
some_function
, je l'appellerais avecsome_function
,*.py
,~/
comme les arguments. Les résultats sont affichés dans un nouveau tampon.la source
find-grep-dired
car OP a mentionné "les résultats présentés sous forme de tampon dirigé ou ..."find-grep-dired
me suis pas utilisé , n'hésitez pas à l'ajouter à la réponse.rgrep
fait un si bon travail de ciblage de la recherche qu'il n'y avait pas de différences de vitesse significatives entre eux. (Je veux dire que rgrep a été légèrement plus rapide dans certains cas, mais je ne m'en souviens pas avec certitude.)next-error
etprevious-error
peut être utilisé pour naviguer dans l'ensemble de résultats. Je trouveM-g M-n
etM-g M-p
la plus pratique des fixations standard.find-grep-dired
ne me donne pas de tampon avec des liens de références croisées.rgrep
le fait pour moi et cette dernière suggestionnext-error
previous-error
est fantastique! Mon seul reproche, c'est que toutes les sorties d'exécution de commandes en désordre au début du tampon.J'utilise avec plaisir
M-x find-grep-dired
depuis des années. Il renvoie les résultats sous forme de tampon dirigé, que vous pouvez utiliser.la source
find-ls-option
) et après tout, vous vous retrouvez avec quelque chose de très verbeux car cela ne fonctionne pas sans avoir la date avant le nom de fichier!Solution 1 (meilleure solution):
Installer l'avocat ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Alors
M-x counsel-git-grep
.Aucune configuration requise (git connaît la racine du projet et les fichiers à exclure). Les deux
git grep
etcounsel
est efficace.Le projet doit être géré par git.
l'avocat requiert le mode lierre.
Solution 2:
Cette solution utilise grep et fonctionne sur n'importe quel projet. Elle est inférieure à la Solution 1 car elle est plus lente et nécessite une configuration manuelle. Il est également basé sur le mode lierre.
Vous devez créer .dir-locals.el pour l'installation
simple-project-root
, voir https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html pour les détails techniquesLe code de la solution 2 n'est qu'un prototype. Ma véritable implémentation est beaucoup plus complexe. Voir
counsel-etags-grep
dans https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.elSommaire:
Ce sont les deux meilleures solutions que je connaisse.
S'il existe d'autres meilleures solutions, elles doivent au moins résoudre les problèmes ci-dessous pour être prêtes pour la production,
comment obtenir le mot clé à grep (par exemple, obtenir le mot clé de la région sélectionnée)
échapper au mot-clé
s'il existe un programme grep plus efficace, nous devrions l'utiliser (ripgrep, the_silver_searcher / ag, ... etc), ou bien utiliser le grep par défaut
la fenêtre des candidats doit utiliser toute la largeur de l'écran et les utilisateurs peuvent filtrer les candidats de manière interactive (c'est pourquoi les gens utilisent du lierre ou du casque)
nous devons montrer le chemin relatif dans la fenêtre candidate
capable de réutiliser le résultat grepped précédent. Le résultat précédent doit donc être enregistré. Vous pouvez utiliser
ivy-resume
depuisivy
ouhelm-resume
depuishelm
Lorsque vous enregistrez le résultat précédent, le contexte du résultat précédent doit également être enregistré. Par exemple, dans le code de la Solution 2.
default-directory
est le contexte. Voir https://github.com/abo-abo/swiper/issues/591 pour plus de détails.L'expression régulière étendue doit être utilisée car elle est plus simple et est déjà utilisée par
counsel-git-grep
the_silver_searcher / ag.la source
Je voudrais ajouter une autre solution à la solution de @chen bin qui utilise également
counsel
(mais vous n'avez pas besoin d'avoir un projet géré pargit
pour cela).Vous devez installer ag (le moteur de recherche Silver) et
counsel
fournir la commandecounsel-ag
qui recherche dans le répertoire en cours la chaîne entrée.Si vous souhaitez rechercher dans un projet (pas seulement le répertoire de travail actuel), ajoutez ceci à votre
.emacs
: -Cette fonction permettra
ag
de rechercher récursivement le répertoire racine du projet.Modifier : la fonction ci-dessus est par défaut le symbole au point de recherche. Si vous n'aimez pas ce comportement, remplacez-le
(thing-at-point 'symbol)
parnil
. Et si vous voulez les résultats de la recherche dans sa propre presse tamponC-c C-oEdit2 : si vous avez
ripgrep
installé, vous pouvez remplacercounsel-ag
parcounsel-rg
dans la fonction ci-dessus et ça ira aussi bien :)la source
projectile-project-root
utilisable pour trouver la racine du projet Rails?rag/...
?rag/
préfixe et cela les rend faciles à trouver sousM-x
:)Voici un exemple de fonction grep personnalisée qui récupère récursivement le contenu des fichiers (en utilisant une expression rationnelle pour le terme de recherche) dans un répertoire et ses sous-répertoires, et affiche les résultats avec des lignes de contexte avant et après. La bibliothèque intégrée
compile.el
et lesgrep.el
bibliothèques proposent plusieurs méthodes pour accéder à l'emplacement du fichier contenant les résultats de la recherche. Il n'est pas nécessaire d'installer quoi que ce soit d'autre pour que cet exemple fonctionne - il suffit d'une version complète d'Emacs et d'un ordinateur sur lequel l'grep
utilitaire est installé. La variablegrep-program
peut être ajustée pour pointer vers un emplacement particulier de l'grep
utilitaire si la valeur par défaut n'est pas suffisante.la source
multiple-cursors
etwgrep
. Il facilite la modification de plusieurs fichiers en un seul coup. Ces bibliothèques, cependant, devraient être installées si ces fonctionnalités sont souhaitées.rgrep
?rgrep
beaucoup de temps à personnaliser selon mes critères de recherche d'expression régulière préférés, et j'ai choisi de tout coder en dur dans une fonction personnalisée (que j'utilise plusieurs fois par jour). Si vous souhaitez rédiger une autre réponse décrivant comment personnaliserrgrep
, cela pourrait être utile à d'autres lecteurs du forum à l'avenir.