Giải pháp 1 (giải pháp tốt nhất):
Cài đặt tư vấn ( https://github.com/abo-abo/swiper/blob/master/cdvisor.el )
Sau đó M-x counsel-git-grep
.
Không cần thiết lập (git biết gốc dự án và các tệp để loại trừ). Cả hai git grep
và counsel
là hiệu quả.
Dự án cần được quản lý bởi git.
tư vấn yêu cầu ivy-mode.
Giải pháp 2:
Giải pháp này sử dụng grep và hoạt động trên bất kỳ dự án nào. Nó kém hơn Giải pháp 1 vì nó chậm hơn và cần thiết lập thủ công. Nó cũng dựa trên chế độ ivy.
(defvar simple-project-root "~/.emacs.d")
(defun simple-grep ()
(interactive)
(unless (featurep 'ivy)
(require 'ivy))
(let* ((default-directory (file-name-as-directory simple-project-root))
(keyword (read-string "Keyword:")))
(ivy-read (format "Grep at %s:" simple-project-root)
(split-string (shell-command-to-string (format "grep -rsnI %s ." keyword)) "\n" t)
:action (lambda (val)
(let* ((lst (split-string val ":"))
(linenum (string-to-number (cadr lst))))
;; open file
(find-file (car lst))
;; goto line if line number exists
(when (and linenum (> linenum 0))
(goto-char (point-min))
(forward-line (1- linenum))))))))
Bạn cần tạo .dir-locals.el để thiết lập simple-project-root
, xem https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html để biết chi tiết kỹ thuật
Mã trong giải pháp 2 chỉ là một nguyên mẫu. Việc thực hiện của tôi phức tạp hơn nhiều. Xem counsel-etags-grep
trong https://github.com/redguardtoo/cdvisor-etags/blob/master/cdvisor-etags.el
Tóm lược:
Đó là hai giải pháp tốt nhất mà tôi biết.
Nếu có bất kỳ giải pháp tốt hơn nào khác tồn tại, ít nhất họ cần giải quyết các vấn đề dưới đây để sẵn sàng sản xuất,
làm cách nào để đưa từ khóa vào grep (ví dụ: lấy từ khóa từ vùng đã chọn)
thoát khỏi từ khóa
nếu chương trình grep hiệu quả hơn tồn tại, chúng ta nên sử dụng nó (ripgrep, the_silver_searcher / ag, ... vv), hoặc nếu không thì dự phòng grep mặc định
cửa sổ ứng cử viên nên sử dụng toàn bộ chiều rộng màn hình và người dùng có thể lọc ứng viên tương tác (đó là lý do tại sao mọi người sử dụng cây thường xuân hoặc mũ bảo hiểm)
chúng ta nên hiển thị đường dẫn tương đối trong cửa sổ ứng cử viên
có thể sử dụng lại kết quả grepping trước đó. Vì vậy, kết quả trước đó nên được lưu lại. Bạn có thể sử dụng ivy-resume
từ ivy
hoặc helm-resume
từhelm
Khi bạn lưu kết quả được grepping trước đó, bối cảnh của kết quả trước đó cũng sẽ được lưu lại. Ví dụ, trong mã của Giải pháp 2. default-directory
là bối cảnh. Xem https://github.com/abo-abo/swiper/issues/591 để biết thêm chi tiết.
Biểu thức chính quy mở rộng nên được sử dụng vì nó đơn giản hơn và đã được sử dụng bởi counsel-git-grep
và the_silver_searcher / ag.
helm-projectile-grep
lệnh (nếu bạn đã cài đặt helm đạn) hayprojectile-grep
chưa?