Quelle est la façon la plus simple de rechercher tous les fichiers utiles dans un même projet?

28

Quelle est la façon la plus simple de rechercher une expression rationnelle dans le contenu de tous les fichiers du projet en cours, en ignorant les fichiers qui ne sont pas utiles?

Les fichiers inutiles sont des fichiers comme les fichiers compilés, les bibliothèques importées, les fichiers de contrôle de version, etc.

Je suis au courant rgrep, mais il cherche juste tout. Existe-t-il un package qui recherche «intelligemment» et connaît plusieurs langages de programmation différents, donc je n'aurais pas à le configurer pour chaque projet individuel?

Malabarba
la source
Votre commentaire "il recherche juste tout" rgrepest un peu déroutant, car il exclut par défaut tous les fichiers correspondant à vos critères "fichiers inutiles".
phils

Réponses:

32

La recherche par projet dans Emacs peut être effectuée à l'aide d'un projectile .

Il permet la configuration par projet de fichiers ignorés (dans un <projectroot>\.projectilefichier) ou spécifie des sous-répertoires pour surveiller et ignorer tous les autres.

Il peut fonctionner grep, ack(nécessite ack-and-a-half.el) et ag( ag.el) sur les fichiers dans le projet défini (soit sur la base du .projectilefichier ou en trouvant un fichier pris en charge VC pour définir une racine de projet).

Commandes utiles

(En ce qui concerne la recherche dans les fichiers utiles)

Selon le Readme du Projectile

  • C-c p s g :: Exécutez grepsur les fichiers du projet.
  • C-c p s a :: Fonctionne acksur le projet. Nécessite la présence d'un accusé de réception et demi.
  • C-c p s s :: Fonctionne agsur le projet. Nécessite la présence d'ag.el.
  • C-c p f :: Affiche une liste de tous les fichiers du projet.
  • C-c p d :: Affiche une liste de tous les répertoires du projet.
  • C-c p a :: Basculez entre les fichiers portant le même nom mais une extension différente dans le projet.
  • C-c p o:: Fonctionne multi-occursur tous les tampons de projet actuellement ouverts.

Ceux-ci n'agiront que sur les fichiers définis comme faisant partie du projet (ou trouvés lorsque le cache est généré / régénéré).

Jonathan Leech-Pepin
la source
Merci, quelle est la commande de projectile que je peux utiliser pour cela?
Malabarba
Modifié pour inclure un sous-ensemble des commandes (celles traitant de recherche, find-file et dired). La liste complète se trouve dans le fichier Lisez-moi du package.
Jonathan Leech-Pepin
13

La recherche à l'échelle du projet de seuls fichiers pertinents peut être effectuée en utilisant agaka the_silver_searcher .

Pourquoi ag?

  • Il ne tient pas compte des modèles de fichiers de votre .gitignore, .hgignore, svn:ignore. Vous pouvez choisir que vos recherches n'utilisent PAS la liste d'ignorance des listes d'ignorance du contrôle de version en utilisant le -Ucommutateur.
  • S'il y a des fichiers dans votre référentiel source que vous ne souhaitez pas rechercher, ajoutez simplement leurs modèles à un .agignorefichier.
    • Un .agignorefichier global peut être placé dans votre $HOME, puis vous pouvez placer des .agignorefichiers plus spécifiques au projet dans les racines de votre projet.

Configuration aget emacs

  • Installez agaka the_silver_searcher sur votre système.
  • Configurez le .agignorefichier. Je préfère avoir juste un .agignorefichier global dans mon $HOME.
  • Installez le agpackage (disponible sur Melpa).
  • Vous pouvez ensuite utiliser la fonction ag-projectou ag-project-regexp(fournie avec le agpackage) pour effectuer des recherches de fichiers à l'échelle du projet.
    • Par défaut, ces fonctions utilisent la racine du référentiel VCS comme répertoire de recherche. Vous pouvez remplacer cela en définissant ou en personnalisant le ag-project-root-function.
    • Même si votre projet n'est pas contrôlé par git, vous pouvez marquer une racine de projet pour les recherches basées sur ag-project/ ag-project-regexpen plaçant un .gitdossier vide dans la racine de votre projet. Vous n'avez alors pas besoin de personnaliser ag-project-root-function.
Kaushal Modi
la source
4

Si votre projet utilise Git, vous n'avez besoin que de counsel https://github.com/abo-abo/swiper

  • counsel-git trouver un fichier

  • counsel-git-grep grep

La seule dépendance est git

La récupération de texte est plus rapide que le moteur de recherche Silver (AG)

L'avocat fournit également d'autres outils puissants. Par exemple, après l'exécution counsel-git-grep, vous pouvez appuyer sur C-c C-oet C-x C-qsur wgrep-modepour remplacer facilement le texte dans la portée du projet.

Il y a un article https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/ expliquant les détails. Cet article utilise counsel-ag(une autre commande intégrée à Counsel) mais cousnel-git-greputilise exactement le même flux de travail.

chen bin
la source
Mais comment se fait-il que la saisie de texte soit plus rapide que ag? Pourriez-vous s'il vous plaît développer?
denis631
1
agest aussi un programme grep, comme git-grep. Je ne peux pas dire lequel est le plus rapide. Voir github.com/BurntSushi/ripgrep qui compare les performances des programmes grep populaires (y compris aget git-grep)
chen bin
1

La première réponse est belle, mais elle laisse de côté certains détails critiques sur les versions modernes d'Emacs. Je suis moi-même connu d'Emacs, donc d'autres nouveaux arrivants pourraient ne pas en être conscients. Étant donné que votre objectif est de rechercher du texte DANS un fichier dans un PROJET, vous devez d'abord installer Projectile à l'aide du référentiel MELPA.

Cela installe le package dans .emacs.d et ajoute une configuration de base à .emacs dans votre répertoire $ USER (en supposant que vous avez créé le fichier .emacs), par exemple en exigeant Projectile dans votre installation Emacs.

Cependant, vous devez toujours l'activer et associer des préfixes de keymap, afin de pouvoir l'invoquer dans le mini tampon.

La réponse acceptée mentionne la commande suivante:

C-c p s g

Cela ne fonctionnera pas, sauf si vous configurez Projectile avec ce préfixe de clavier. Mais je l'ai configuré pour utiliser Cc Cp comme commande pour Project dans .emacs:

(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)

Maintenant, étant donné cela, je peux effectuer des recherches de texte dans les fichiers d'un projet en utilisant grep:

C-c C-p f # switch to a project first
C-c C-p s g # perform grep search in project

Pour le décomposer, C-c C-pil invoquera Projectile et s geffectuera la recherche grep. Vous obtiendrez une belle sortie comme celle-ci, en supposant que votre recherche est visit_contactet que vous recherchez la spécification de Ruby dans un projet:

./spec/support/capybara_classification_code_helper.rb:21:  def visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:8:    visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:33:    visit_contact
./spec/features/user_views_global_filters_from_line_item_spec.rb:9:      visit_contact
Donato
la source