โซลูชันที่ 1 (ทางออกที่ดีที่สุด):
ติดตั้งที่ปรึกษา ( https://github.com/abo-abo/swiper/blob/master/c Counsel.el )
M-x counsel-git-grep
แล้วก็
ไม่จำเป็นต้องตั้งค่า (git รู้จักรูทโปรเจ็กต์และไฟล์ที่จะไม่รวม) ทั้งgit grep
และcounsel
มีประสิทธิภาพ
จำเป็นต้องมีการจัดการโครงการโดย git
ที่ปรึกษาต้องใช้โหมด ivy
โซลูชันที่ 2:
โซลูชันนี้ใช้ grep และทำงานกับโครงการใด ๆ มันด้อยกว่าโซลูชัน 1 เนื่องจากช้ากว่าและต้องตั้งค่าด้วยตนเอง มันขึ้นอยู่กับโหมด 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))))))))
คุณต้องสร้าง. dir-locals.el เพื่อตั้งค่าsimple-project-root
ดูhttps://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.htmlเพื่อดูรายละเอียดทางเทคนิค
โค้ดในโซลูชัน 2 เป็นเพียงต้นแบบ การใช้งานจริงของฉันมีความซับซ้อนมากขึ้น ดูcounsel-etags-grep
ในhttps://github.com/redguardtoo/c Counsel-etags/blob/master/c Counsel-etags.el
สรุป:
นี่เป็นทางออกที่ดีที่สุดสองข้อที่ฉันรู้
หากมีวิธีแก้ปัญหาอื่นที่ดีกว่าพวกเขาต้องการอย่างน้อยแก้ปัญหาด้านล่างให้พร้อมผลิต
วิธีรับคีย์เวิร์ดเพื่อ grep (เช่นรับคีย์เวิร์ดจากภูมิภาคที่เลือก)
หลบหนีคำหลัก
หากมีโปรแกรม grep ที่มีประสิทธิภาพมากขึ้นเราควรใช้มัน (ripgrep, the_silver_searcher / ag, ... ฯลฯ ) หรือมิฉะนั้นให้เลือก grep เริ่มต้น
หน้าต่างตัวเลือกควรใช้เต็มความกว้างของหน้าจอและผู้ใช้สามารถกรองตัวเลือกแบบโต้ตอบ
เราควรแสดงเส้นทางสัมพัทธ์ในหน้าต่างตัวเลือก
สามารถใช้ผลลัพธ์ grepped ก่อนหน้านี้ได้อีกครั้ง ดังนั้นควรบันทึกผลลัพธ์ก่อนหน้า คุณสามารถใช้ivy-resume
จากivy
หรือhelm-resume
จากhelm
เมื่อคุณบันทึกผลลัพธ์ grepped ก่อนหน้าบริบทของผลลัพธ์ก่อนหน้าควรถูกบันทึกด้วย ตัวอย่างเช่นในรหัสของโซลูชัน 2 default-directory
คือบริบท ดูhttps://github.com/abo-abo/swiper/issues/591สำหรับรายละเอียดเพิ่มเติม
ควรใช้นิพจน์ทั่วไปเพิ่มเติมเนื่องจากง่ายกว่าและถูกใช้แล้วโดยcounsel-git-grep
the_silver_searcher / ag
helm-projectile-grep
คำสั่ง (ถ้าคุณติดตั้ง projectile helm) หรือprojectile-grep
ไม่?