एकल प्रोजेक्ट के अंदर सभी उपयोगी फ़ाइलों को खोजने का सबसे आसान तरीका क्या है?


28

वर्तमान प्रोजेक्ट में सभी फ़ाइलों के लिए एक regexp की खोज करने का सबसे आसान तरीका क्या है, फ़ाइलों को स्किप करना उपयोगी नहीं है?

बेकार फाइलें संकलित फाइलें, आयातित पुस्तकालय, संस्करण-नियंत्रण फाइलें, आदि जैसी चीजें हैं।

मुझे पता है rgrep, लेकिन यह सब कुछ खोजता है। क्या कोई ऐसा पैकेज है जो 'बौद्धिक रूप से' खोज करता है और कई अलग-अलग प्रोग्रामिंग भाषाओं के बारे में जानता है, इसलिए मुझे इसे प्रत्येक व्यक्तिगत परियोजना के लिए कॉन्फ़िगर नहीं करना होगा?


आपका "यह बस सब कुछ खोजता है" टिप्पणी के बारे rgrepमें थोड़ा भ्रमित है, यह देखते हुए कि यह डिफ़ॉल्ट रूप से आपकी "बेकार फाइलों" मानदंडों से मेल खाती सभी फ़ाइलों को बाहर करता है।
फिल्स

जवाबों:


32

Emacs के भीतर प्रोजेक्ट आधारित खोज प्रोजेक्टाइल का उपयोग करके की जा सकती है ।

यह अनदेखा फ़ाइलों (एक <projectroot>\.projectileफ़ाइल में) के प्रति-प्रोजेक्ट कॉन्फ़िगरेशन के लिए अनुमति देता है , या सभी अन्य लोगों की निगरानी और अनदेखी करने के लिए उपनिर्देशिका निर्दिष्ट करता है।

यह चला सकते हैं grep, ack(की आवश्यकता ack-and-a-half.el) और ag( ag.el) परिभाषित परियोजना के भीतर फ़ाइलों पर (या तो के आधार पर .projectileफ़ाइल या एक परियोजना जड़ को परिभाषित करने के लिए एक समर्थित कुलपति फ़ाइल का पता लगाकर)।

उपयोगी कमांड

(उपयोगी फ़ाइलों के माध्यम से खोज करने के संबंध में)

प्रोजेक्टाइल रीडमे के अनुसार

  • C-c p s g :: grepप्रोजेक्ट में फ़ाइलों पर चलाएँ ।
  • C-c p s a :: ackप्रोजेक्ट पर चलता है। एक-एक-डेढ़ की उपस्थिति की आवश्यकता है।
  • C-c p s s :: agप्रोजेक्ट पर चलता है। Ag.el की उपस्थिति की आवश्यकता है
  • C-c p f :: परियोजना में सभी फाइलों की एक सूची प्रदर्शित करें।
  • C-c p d :: परियोजना में सभी निर्देशिकाओं की एक सूची प्रदर्शित करें।
  • C-c p a :: प्रोजेक्ट में समान नाम लेकिन अलग-अलग एक्सटेंशन वाली फाइलों के बीच स्विच करें।
  • C-c p o:: multi-occurवर्तमान में खुले सभी प्रोजेक्ट बफ़र्स पर रन ।

ये केवल परियोजना का हिस्सा होने के रूप में परिभाषित फ़ाइलों पर कार्य करेंगे (या कैश उत्पन्न / पुनर्जीवित होने पर पाया जाता है)।


धन्यवाद, क्या प्रोजेक्टाइल कमांड है जो मैं इसके लिए उपयोग कर सकता हूं?
मालाबार

आदेशों के एक सबसेट को शामिल करने के लिए इसे संपादित किया गया है (जो खोज, खोज-फ़ाइल और दिनांकित के साथ काम कर रहे हैं)। पूरी सूची पैकेज readme में है।
जोनाथन लीच-पेपिन

13

केवल प्रासंगिक फ़ाइलों की परियोजना-व्यापी खोज को aga__silver_searcher का उपयोग करके किया जा सकता है ।

क्यों अग?

  • यह अपने से फ़ाइल पैटर्न पर ध्यान नहीं देता .gitignore, .hgignore, svn:ignoreआप -Uस्विच का उपयोग करके संस्करण-नियंत्रण उपेक्षा सूची से अनदेखी सूची का उपयोग नहीं करने के लिए अपनी खोजों के लिए चुन सकते हैं ।
  • यदि आपके स्रोत में ऐसी फाइलें हैं, जिन्हें आप खोजना नहीं चाहते हैं, तो बस एक .agignoreफाइल में उनके पैटर्न जोड़ें ।
    • एक वैश्विक .agignoreफ़ाइल को आपके पास रखा जा सकता है $HOMEऔर फिर आप .agignoreअपनी परियोजना की जड़ों में अधिक परियोजना विशिष्ट फाइलें रख सकते हैं।

स्थापना agऔर emacs

  • अपने सिस्टम पर agउर्फ the_silver_searcher स्थापित करें ।
  • .agignoreफ़ाइल सेट करें । मैं अपने में सिर्फ एक वैश्विक .agignoreफ़ाइल रखना पसंद करता हूं $HOME
  • agपैकेज स्थापित करें (मेलपा पर उपलब्ध)।
  • तब आप प्रोजेक्ट-वाइड फ़ाइल खोजों को करने के लिए ( ag-projectया पैकेज के ag-project-regexpसाथ आने वाले ag) फंक्शन का उपयोग कर सकते हैं ।
    • डिफ़ॉल्ट रूप से, ये फ़ंक्शन खोज करने के लिए निर्देशिका के रूप में VCS रेपो की जड़ का उपयोग करते हैं। आप सेटिंग या कस्टमाइज़ करके इसे ओवरराइड कर सकते हैं ag-project-root-function
    • यहां तक ​​कि अगर आपकी परियोजना को नियंत्रित नहीं किया जाता है, तो आप अपने प्रोजेक्ट रूट में एक खाली फ़ोल्डर डालकर ag-project/ ag-project-regexpआधारित खोजों के लिए प्रोजेक्ट-रूट को चिह्नित कर सकते हैं .git। फिर आपको कस्टमाइज़ नहीं करना होगा ag-project-root-function

4

यदि आपका प्रोजेक्ट Git का उपयोग करता है, तो आपको केवल https://github.com/abo-abo/swiper की आवश्यकता हैcounsel

  • counsel-git फ़ाइल खोजने के लिए

  • counsel-git-grep पकड़ना

एकमात्र निर्भरता गिट है

पाठ खोज चांदी शोधक (एजी) से तेज है

परामर्शदाता अन्य शक्तिशाली उपकरण भी प्रदान करता है। उदाहरण के लिए, चलाने के बाद counsel-git-grep, आप भी दबा सकते हैं C-c C-oऔर C-x C-qमें जाने के लिए wgrep-modeकरने के लिए आसानी से परियोजना के दायरे में टेक्स्ट को बदलें।

एक लेख है https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/ स्पष्टीकरण विवरण। वह लेख का उपयोग करता है counsel-ag(वकील में निर्मित एक और कमांड) लेकिन cousnel-git-grepठीक उसी कार्य प्रवाह का उपयोग करता है।


लेकिन कैसे आता है टेक्स्ट-ग्रिपिंग एजी से तेज है? क्या आप कृपया विस्तार से बता सकते हैं?
डेनिस 631

1
agएक grep प्रोग्राम भी है, जैसे git-grep। मैं नहीं कह सकता जो तेज है। Github.com/BurntSushi/ripgrep देखें, जो लोकप्रिय grep कार्यक्रमों के प्रदर्शन की तुलना करता है (सहित agऔर git-grep)
chen bin

1

पहला उत्तर सुंदर है, लेकिन यह Emacs के आधुनिक संस्करणों के बारे में कुछ महत्वपूर्ण विवरणों को छोड़ देता है। मुझे खुद Emacs के बारे में पता है, इसलिए अन्य नए लोगों को इसके बारे में जानकारी नहीं हो सकती है। अपने लक्ष्य को देखते हुए एक परियोजना में एक फ़ाइल के बिना पाठ की खोज करना है, तो आप सबसे पहले MELPA भंडार का उपयोग करके प्रोजेक्टाइल स्थापित करेंगे।

यह .emacs.d में पैकेज को स्थापित करता है और आपके $ USER निर्देशिका में (.emacs फ़ाइल को बनाया है) यह मानकर आपके एमएसीएस इंस्टाल में प्रोजेक्टाइल की आवश्यकता होती है।

हालांकि, आपको अभी भी इसे सक्षम करने और कीमैप उपसर्गों को संबद्ध करने की आवश्यकता है, इसलिए आप इसे मिनी बफर में आमंत्रित कर सकते हैं।

स्वीकृत उत्तर में निम्न आदेश का उल्लेख है:

C-c p s g

यह तब तक काम नहीं करेगा, जब तक कि आप इस कीमैप उपसर्ग के साथ प्रोजेक्टाइल को कॉन्फ़िगर नहीं करते हैं। लेकिन मैंने इसे प्रोजेक्ट .emacs में कमांड के रूप में Cc Cp का उपयोग करने के लिए कॉन्फ़िगर किया है:

(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)

अब इसे देखते हुए, मैं grep का उपयोग करके किसी प्रोजेक्ट में फ़ाइलों में पाठ खोज करने में सक्षम हूं:

C-c C-p f # switch to a project first
C-c C-p s g # perform grep search in project

इसे तोड़ने के लिए, C-c C-pप्रक्षेप्य को आमंत्रित करेगा, और s ggrep खोज का प्रदर्शन करेगा। आपको इस तरह एक सुंदर आउटपुट मिलेगा, यह मानकर कि आपकी खोज है visit_contactऔर आप किसी प्रोजेक्ट में रूबी की खोज कर रहे हैं:

./spec/support/capybara_classification_code_helper.rb:21:  def visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:8:    visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:33:    visit_contact
./spec/features/user_views_global_filters_from_line_item_spec.rb:9:      visit_contact
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.