समाधान 1 (सबसे अच्छा समाधान):
परामर्श स्थापित करें ( https://github.com/abo-abo/swiper/blob/master/c परामर्श. el )
तब M-x counsel-git-grep।
किसी भी सेटअप की जरूरत नहीं है (git प्रोजेक्ट रूट और फाइलों को बाहर करने के लिए जानता है)। दोनों git grepऔर counselकुशल है।
परियोजना की आवश्यकता गिट द्वारा प्रबंधित की जानी चाहिए।
वकील को आइवी-मोड की आवश्यकता होती है।
समाधान 2:
यह समाधान grep का उपयोग करता है और किसी भी परियोजना पर काम करता है। यह समाधान 1 से नीच है क्योंकि यह धीमा है और मैनुअल सेटअप की आवश्यकता है। यह आइवी-मोड पर भी आधारित है।
(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/counsel-etags/blob/master/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-grepthe_silver_searcher / ag द्वारा उपयोग किया जाता है ।
helm-projectile-grepकमांड का उपयोग करने की कोशिश की है (यदि आपके पास हेल्म प्रोजेक्टाइल स्थापित है) याprojectile-grep?