2014-09-02 5 views
8

Ich möchte in der Lage, den normalen M-x rgrep Workflow (ein Muster Eingabe einen Weg und in einem *grep* Puffer der verknüpften Anzeige von Ergebnissen) zu verwenden, aber git grep anstelle des normalen find Befehl:Wie kann ich M-x rgrep mit dem Befehl git grep in Emacs verwenden?

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

Ich habe versucht, direkt Einstellen der grep-find-command Variable:

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

und grep-apply-setting

Verwendung 10

aber keiner scheint zu funktionieren. Wenn ich rufe M-x rgrep es verwendet nur den gleichen find Befehl wie zuvor.

In der Tat, ich bin ziemlich sicher, dass jetzt, dass rgrep auch nicht die grep-find-command Variable verwenden, aber ich kann nicht herausfinden, wo es Befehl ist gespeichert ist.

Antwort

11

Stellt sich heraus die relevante Variable ist eigentlich grep-find-template. Dies nimmt einen Befehl mit einigen zusätzlichen Parametern:

  • <D> für das Basisverzeichnis
  • <X> für die Entdeckung Optionen Verzeichnisliste
  • <F> für die Entdeckung Optionen zu beschränken, um die Dateien
  • <C> angepasst zu begrenzen für den Ort -i zu setzen, wenn die Suche case-insensitive
  • <R> für den regulären Ausdruck für die Suche nach

Die Standardvorlage wie folgt aussieht:

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

Um den Befehl Arbeit mit git grep zu machen, hatte ich in ein paar Optionen zu übergeben, um sicherzustellen, git keinen Pager nicht verwendet und gibt Dinge in der richtiges Format. Ich habe auch ein paar der Vorlagenoptionen ignoriert, weil git grep bereits die Dateien auf natürliche Weise beschränkt. Es macht jedoch wahrscheinlich Sinn, sie irgendwie wieder hinzuzufügen.

Mein neuer Wert für grep-find-template ist

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

Nach einigen oberflächlichen Tests, es scheint zu funktionieren.

Beachten Sie, dass diese Variable sollte grep-apply-setting mit, anstatt es direkt zu modifizieren:

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

Da ich nicht zwei der Eingänge rgrep nicht verwenden, schrieb ich meine eigenen git-grep Befehl, der vorübergehend die alte stashes grep-find-template und ersetzt es durch meine. Das fühlt sich ein wenig hacky an, scheint aber auch zu funktionieren.

(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

Was M-x vc-git-grep (C-x v f). Tut das nicht, was Sie brauchen?

Es fordert Dich auf:

  • Suchmuster (Standard: Token an dem Punkt, oder Region)
  • Namensmuster (Standard: aktuelle Datei-Suffix)
  • Basissuchverzeichnis (Standard, aktuelles Verzeichnis)

Funktioniert gut für mich.

(obwohl gesagt hat, dass ich merke jetzt, dass ich die Funktion zu beraten hatte, es zu bekommen richtigen Farben zu tun Es kann ein besserer Weg, dies zu tun.

(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 Ja, ich wusste eigentlich nichts über diesen Befehl. Für mich hat es auch das gleiche Problem mit Paging, anstatt die Ergebnisse direkt zurück zu geben. Das könnte mit demselben Ratschlag behoben werden. –

+0

Und es ist auch nicht rekursiv mit Standard 'grep-files-aliases'-Mustern. Benötigt, um einen Hinweis dafür hinzuzufügen. – eush77

Verwandte Themen