2014-09-02 8 views
8

voglio essere in grado di utilizzare la normale M-x rgrep workflow (inserimento di un percorso, un modello e la visualizzazione dei risultati collegati in tampone *grep*) ma utilizzando git grep invece del normale find comando:Come posso usare M-x rgrep con il comando git grep in Emacs?

find . -type f -exec grep -nH -e {} + 

ho provato direttamente impostare la variabile grep-find-command:

(setq grep-find-command "git grep") 

e utilizzando grep-apply-setting

(grep-apply-setting 'grep-find-command "git grep") 

ma nessuno dei due sembra funzionare. Quando corro M-x rgrep, viene utilizzato lo stesso comando find come prima.

In realtà, sono abbastanza sicuro ora che rgrep non ha nemmeno utilizzare la variabile grep-find-command, ma non riesco a capire dove è il comando è memorizzato.

risposta

11

Risulta che la variabile rilevante è in realtà grep-find-template. Questo richiede un comando con un paio di parametri aggiuntivi:

  • <D> per la directory di base
  • <X> per le opzioni di find per limitare la lista di directory
  • <F> per le opzioni di find per limitare i file abbinati
  • <C> per il posto da inserire -i se la ricerca è senza distinzione tra maiuscole e minuscole
  • <R> per l'espressione regolare per cercare

Il modello predefinito si presenta così:

find . <X> -type f <F> -exec grep <C> -nH -e <R> {} + 

per far funzionare il comando con git grep, ho dovuto passare alcune opzioni per assicurarsi git non usa un cercapersone e uscite cose nel giusto formato. Ho anche ignorato alcune delle opzioni del modello perché git grep limita già i file cercati in modo naturale. Tuttavia, probabilmente ha senso aggiungerli in qualche modo.

mio nuovo valore per grep-find-template è

git --no-pager grep --no-color --line-number <C> <R> 

Dopo alcune prove superficiale, sembra funzionare.

Si noti che è necessario impostare questa variabile usando grep-apply-setting piuttosto che modificare direttamente:

(grep-apply-setting 'grep-find-template "git --no-pager grep --no-color --line-number <C> <R>") 

Dato che io non uso a due degli ingressi per rgrep, ho scritto la mia git-grep comando che immagazzina temporaneamente il vecchio grep-find-template e lo sostituisce con il mio. Questo sembra un po 'hacky, ma sembra funzionare.

(defcustom git-grep-command "git --no-pager grep --no-color --line-number <C> <R>" 
    "The command to run with M-x git-grep.") 
(defun git-grep (regexp) 
    "Search for the given regexp using `git grep' in the current directory." 
    (interactive "sRegexp: ") 
    (unless (boundp 'grep-find-template) (grep-compute-defaults)) 
    (let ((old-command grep-find-template)) 
    (grep-apply-setting 'grep-find-template git-grep-command) 
    (rgrep regexp "*" "") 
    (grep-apply-setting 'grep-find-template old-command))) 
12

Che dire M-x vc-git-grep (C-x v f). Non fa quello che ti serve?

Si richiede:

  • modello di ricerca (default: Token a punto, o una regione)
  • nome del file modello (default: suffisso del file corrente) annuario ricerca
  • base (di default, dir corrente)

Funziona bene per me.

(anche se detto questo, io ora notare che ho dovuto consigliare la funzione per arrivare a fare i colori destra Ci può essere un modo migliore per fare questo:.

(defadvice grep-expand-template (around grep-expand-template-with-git-color) 
    (when (and (string-match "^git grep " (ad-get-arg 0)) 
      (not (string-match " --color=" (ad-get-arg 0)))) 
    (ad-set-arg 0 (replace-regexp-in-string 
        "^git grep " "git grep --color=auto " (ad-get-arg 0)))) 
    ad-do-it) 
(defadvice vc-git-grep (around vc-git-grep-with-color activate) 
    (ad-activate-regexp "grep-expand-template-with-git-color") 
    ad-do-it 
    (ad-deactivate-regexp "grep-expand-template-with-git-color")) 

)

+0

Oh si, in realtà non sapevo di quel comando. Per me, ha anche lo stesso problema con il paging invece di restituire direttamente i risultati. Questo potrebbe essere risolto con lo stesso consiglio. –

+0

Ed inoltre non è ricorsivo con i pattern predefiniti 'grep-files-aliases'. Ho bisogno di aggiungere un consiglio per questo. – eush77