2014-09-02 12 views
8

Tôi muốn để có thể sử dụng M-x rgrep công việc bình thường (bước vào một con đường, một mô hình và hiển thị kết quả liên kết trong một bộ đệm *grep*) nhưng sử dụng git grep thay vì bình thường find lệnh:Làm cách nào tôi có thể sử dụng lệnh M-x rgrep bằng lệnh git grep trong Emacs?

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

tôi đã cố gắng trực tiếp thiết lập các grep-find-command biến:

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

và sử dụng grep-apply-setting

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

nhưng dường như không hoạt động. Khi tôi chạy M-x rgrep, nó chỉ sử dụng cùng một lệnh find như trước đây.

Trong thực tế, tôi chắc chắn rằng bây giờ rgrep thậm chí không sử dụng biến số grep-find-command, nhưng tôi không thể tìm ra nơi lệnh của nó được lưu trữ.

Trả lời

11

Biến biến có liên quan thực tế là grep-find-template. Này có một lệnh với một vài thông số bổ sung:

  • <D> cho thư mục cơ sở
  • <X> cho các tùy chọn tìm để hạn chế danh sách thư mục
  • <F> cho các tùy chọn tìm để hạn chế các tập tin phù hợp
  • <C> để đặt địa điểm -i nếu tìm kiếm phân biệt chữ hoa chữ thường
  • <R> cho cụm từ thông dụng để tìm kiếm

Các mẫu mặc định trông như thế này:

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

Để thực hiện các công việc lệnh với git grep, tôi đã phải vượt qua trong một vài lựa chọn để đảm bảo git không sử dụng một máy nhắn tin và kết quả đầu ra điều trong định dạng đúng. Tôi cũng bỏ qua một vài tùy chọn mẫu vì git grep đã hạn chế các tệp được tìm kiếm theo cách tự nhiên. Tuy nhiên, nó có thể có ý nghĩa để thêm chúng trở lại bằng cách nào đó.

giá trị mới của tôi cho grep-find-template

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

Sau một số thử nghiệm lướt qua, có vẻ như để làm việc.

Lưu ý rằng bạn nên đặt biến này sử dụng grep-apply-setting chứ không phải sửa đổi nó trực tiếp:

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

Vì tôi không sử dụng hai trong số những đầu vào cho rgrep, tôi đã viết lệnh riêng git-grep tôi mà tạm thời ẩn nấp cũ grep-find-template và thay thế bằng mật khẩu của tôi. Điều này cảm thấy một chút hacky, nhưng cũng có vẻ làm việc.

(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

Điều gì về M-x vc-git-grep (C-x v f). Điều đó không làm những gì bạn cần?

Nó nhắc bạn về:

  • mẫu tìm kiếm (mặc định: thẻ vào thời điểm, hoặc vùng)
  • filename mẫu (mặc định: hiện tại tập tin suffix) thư mục tìm kiếm
  • cơ sở (mặc định, thư mục hiện tại)

Hoạt động tốt cho tôi.

(mặc dù có nói rằng, bây giờ tôi nhận thấy rằng tôi đã tham mưu cho chức năng để có được nó để làm màu sắc phù hợp Có thể có một cách tốt hơn để làm điều này:.

(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 vâng, tôi thực sự không biết về lệnh đó. Đối với tôi, nó cũng có cùng một vấn đề với phân trang thay vì trả lại kết quả trực tiếp. Điều đó có thể được cố định với cùng một lời khuyên. –

+0

Và nó cũng không đệ quy với các mẫu 'grep-files-aliases' mặc định. Cần thêm một lời khuyên cho điều đó. – eush77

Các vấn đề liên quan