Qual è il modo più semplice per cercare tutti i file utili all'interno di un singolo progetto?


28

Qual è il modo più semplice per cercare una regexp nel contenuto di tutti i file nel progetto corrente, saltando i file che non sono utili?

I file inutili sono cose come file compilati, librerie importate, file di controllo versione, ecc.

Ne sono consapevole rgrep, ma cerca solo tutto. Esiste un pacchetto che cerca "in modo intelligente" e conosce diversi linguaggi di programmazione, quindi non dovrei configurarlo per ogni singolo progetto?


Il tuo commento "cerca solo tutto" rgrepè un po 'confuso, dato che esclude tutti i file che corrispondono ai tuoi criteri "file inutili" per impostazione predefinita.
phils,

Risposte:


32

La ricerca basata sul progetto all'interno di Emacs può essere eseguita utilizzando il proiettile .

Consente la configurazione per progetto dei file ignorati (in un <projectroot>\.projectilefile) o specifica le sottodirectory per monitorare e ignorare tutti gli altri.

Può essere eseguito grep, ack(richiede ack-and-a-half.el) e ag( ag.el) su file all'interno del progetto definito (in base al .projectilefile o trovando un file VC supportato per definire una radice del progetto).

Comandi utili

(Per quanto riguarda la ricerca attraverso file utili)

Come da file Leggimi di proiettile

  • C-c p s g :: Esegui grepsui file nel progetto.
  • C-c p s a :: Funziona acksul progetto. Richiede la presenza di ack-and-a-half.
  • C-c p s s :: Funziona agsul progetto. Richiede la presenza di ag.el.
  • C-c p f :: Visualizza un elenco di tutti i file nel progetto.
  • C-c p d :: Visualizza un elenco di tutte le directory nel progetto.
  • C-c p a :: Passa da un file all'altro con lo stesso nome ma un'estensione diversa nel progetto.
  • C-c p o:: Viene eseguito multi-occursu tutti i buffer di progetto attualmente aperti.

Questi agiranno solo sui file definiti come parte del progetto (o trovati quando la cache viene generata / rigenerata).


Grazie, qual è il comando proiettile che posso usare per questo?
Malabarba,

Modificato per includere un sottoinsieme dei comandi (quelli che si occupano di ricerca, find-file e dired). L'elenco completo è nel file Leggimi del pacchetto.
Jonathan Leech-Pepin,

13

La ricerca a livello di progetto di soli file pertinenti può essere effettuata utilizzando agaka the_silver_searcher .

Perché ag?

  • Ignora modelli di file dal vostro .gitignore, .hgignore, svn:ignore. Puoi scegliere che le tue ricerche NON utilizzino l'elenco ignore dagli elenchi ignori di controllo versione utilizzando l' -Uopzione.
  • Se ci sono file nel repository di origine che non si desidera cercare, è sufficiente aggiungere i loro pattern a un .agignorefile.
    • Un .agignorefile globale può essere inserito nel tuo $HOMEe quindi puoi mettere più .agignorefile specifici del progetto nelle radici del tuo progetto.

Installazione aged emacs

  • Installa agaka the_silver_searcher sul tuo sistema.
  • Imposta il .agignorefile. Preferisco avere solo un .agignorefile globale nel mio $HOME.
  • Installa il agpacchetto (disponibile su Melpa).
  • È quindi possibile utilizzare la funzione ag-projecto ag-project-regexp(fornita con il agpacchetto) per eseguire ricerche di file a livello di progetto.
    • Per impostazione predefinita, queste funzioni utilizzano la radice del repository VCS come directory in cui effettuare la ricerca. È possibile sovrascriverla impostando o personalizzando il ag-project-root-function.
    • Anche se il tuo progetto non è controllato da git, puoi contrassegnare una radice del progetto per le ricerche ag-project/ ag-project-regexpbased inserendo una .gitcartella vuota nella radice del tuo progetto. Quindi non è necessario personalizzare ag-project-root-function.

4

Se il tuo progetto utilizza Git, hai solo bisogno di counsel https://github.com/abo-abo/swiper

  • counsel-git per trovare il file

  • counsel-git-grep grep

L'unica dipendenza è git

Il grepping del testo è più veloce del cercatore d'argento (ag)

Il consiglio fornisce anche altri potenti strumenti. Ad esempio, dopo l'esecuzione counsel-git-grep, è possibile premere C-c C-oe C-x C-qper accedere wgrep-modeper sostituire facilmente il testo nell'ambito del progetto.

C'è un articolo https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/ che spiega i dettagli. Quell'articolo usa counsel-ag(un altro comando incorporato nel consiglio) ma cousnel-git-grepusa esattamente lo stesso flusso di lavoro.


Ma come mai il text-grepping è più veloce di un ag? Potresti per favore elaborare?
denis631,

1
agè anche un programma grep, come git-grep. Non posso dire quale sia più veloce. Vedi github.com/BurntSushi/ripgrep che confronta le prestazioni dei programmi grep più diffusi (incluso age git-grep)
chen bin

1

La prima risposta è bellissima, ma tralascia alcuni dettagli critici sulle versioni moderne di Emacs. Conosco Emacs da solo, quindi altri neofiti potrebbero non esserne consapevoli. Dato che il tuo obiettivo è quello di cercare il testo ALL'INTERNO di un file in un PROGETTO, devi prima installare Projectile usando il repository MELPA.

Questo installa il pacchetto in .emacs.d e aggiunge alcune configurazioni di base a .emacs nella directory $ USER (supponendo che tu abbia creato il file .emacs), come richiedere Projectile nella tua installazione di Emacs.

Tuttavia, è ancora necessario abilitarlo e associare i prefissi keymap, quindi è possibile richiamarlo nel mini buffer.

La risposta accettata menziona il seguente comando:

C-c p s g

Questo non funzionerà, a meno che non si configuri Projectile con questo prefisso keymap. Ma l'ho configurato per usare Cc Cp come comando per Project in .emacs:

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

Ora dato questo, sono in grado di eseguire ricerche di testo nei file in un progetto usando grep:

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

Per scomporlo, C-c C-pinvocherà Projectile ed s geseguirà la ricerca grep. Otterrai un risultato bellissimo come questo, supponendo che la tua ricerca sia visit_contacte stai cercando l'RSPec di Ruby in un progetto:

./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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.