क्या grep / ack / ag आउटपुट मोड से क्वेरी-प्रतिस्थापन का उपयोग करने का कोई तरीका है?


31

मुझे पता है find-grep-dired, संबंधित फाइलों को चिह्नित Qकरना और फिर dired-do-query-replace-regexpचिह्नित फाइलों पर चलने के लिए दबाव डालना । दुर्भाग्य से जिसे grep को पुनरारंभ करने की आवश्यकता होती है और अब git-grep, ack, या ag और स्विचिंग का उपयोग करने के लिए find-grepजो कि खोज के लिए एक अलग वाक्यविन्यास है।

मैं भी multi-occurऔर के बारे में पता कर रहा हूँ occur-edit-mode, लेकिन खोज का उपयोग करते हुए पुनः आरंभ करने की आवश्यकता है। अंत में, ag-diredफ़ाइल की सामग्री पर नहीं, फ़ाइल नाम पर मेल खाता है।

मेरा वर्तमान तरीका grep आउटपुट जनरेट करना है, और फिर grep बफर में शुरू होने वाले मैक्रो को रन करना है, और प्रत्येक मैच पर जाकर उसे बदलना है। मैं query-replaceमैचों के सेट पर सीधे उपयोग करना पसंद करूंगा ।

मुझे क्या करना चाहते हैं या तो जल्दी से है कि मैं उन पर उचित फ़ाइलें और कॉल क्वेरी-regexp चिह्नित कर सकते हैं, या के लिए बफ़र्स की एक सूची में ग्रेप उत्पादन को बदलने मौजूदा ग्रेप उत्पादन से एक dired बफर निर्माण करने के लिए इतना है multi-occurताकि मैं उपयोग कर सकते हैं occur-edit-modeकरने के लिए इसे संपादित करें और query-replaceउस बफ़र पर चलाएँ ।

क्या यह कार्यक्षमता मौजूद है, या कोई अन्य वर्कफ़्लो है जो इस समस्या को हल करता है?

जवाबों:


28

@ मालाबार ने wgrepgrep / ack / ag परिणामों के संपादन के लिए पैकेज के उपयोग का उल्लेख किया ।

मैं agपैकेज का उपयोग करते हुए पैकेज के पैकेज और पैकेज का उपयोग करने के बारे में एक विस्तृत चलना लिखना चाहूंगा, ताकि पैकेज wgrep-agका उपयोग करके परिणाम प्राप्त किए जा सकें multiple-cursors

ये पैकेज मेलपा के माध्यम से उपलब्ध हैं। आपको अपने सिस्टम पर agउर्फ the_silver_searcher स्थापित करने की भी आवश्यकता है।

यह वॉक-थ्रू उन मामलों पर लागू होता है, जहां आप उन सभी / चयनित स्थानों पर एकल पंक्ति संपादन करने का तरीका खोज रहे हैं जो agमिले।

  • agअपने सिस्टम और उपर्युक्त emacs संकुल पर स्थापित करें ।

  • agउन सामग्रियों के साथ खोज करने वाली फ़ाइलों का समर्थन करता है जो आपके निर्दिष्ट रेगेक्स से मेल खाती हैं। यह बताने का सबसे सरल तरीका है कि agप्रोजेक्ट रूट को .gitवहां एक खाली फ़ोल्डर कहां रखना है । फिर खोज का उपयोग कर M-x ag-project-regexp

  • परिणामी खोज का बफर डिफ़ॉल्ट रूप से संपादन योग्य नहीं है। इसे संपादन योग्य बनाने के M-x wgrep-change-to-wgrep-modeलिए wgrep-dfault बाइंडिंग करें या उसका उपयोग करें C-c C-p

  • अब यदि आपको अपनी सभी फाइलों में 'एब्डेफ़' को 'ग़ज़ल' में बदलने की ज़रूरत है, तो आप 'एब्डेफ़' की खोज करेंगे और एग परिणाम बफर उस स्ट्रिंग वाले सभी लाइनों को प्रदर्शित करेगा। फिर आप उस बफर को संपादन योग्य बनाते हैं और उन तारों को मैन्युअल रूप से बदलते हैं और उन परिवर्तनों को M-x wgrep-finish-editडिफ़ॉल्ट बाइंडिंग करने या उपयोग करने पर वास्तविक फ़ाइल बफ़र्स में परिलक्षित होता है C-c C-e। आप query-replace-regexpउस खोज को प्रतिस्थापित करने के लिए भी उपयोग कर सकते हैं ।

  • मैं multiple-cursorsतेजी से रिफैक्टरिंग के लिए उपयोग करना पसंद करता हूं ताकि मैं एक वास्तविक समय प्रतिक्रिया देख सकूं जहां मेरे कई संपादन एक साथ हो रहे हैं। स्ट्रिंग को हाइलाइट करें जिसे आप उस एजी परिणाम बफर में बदलना चाहते हैं और कॉल करें M-x mc/mark-all-like-thisऔर फिर विस्मय में दूर संपादित करें क्योंकि आप एक ही समय में कई बिंदुओं पर संपादित किए गए सामान को देख रहे हैं।

  • एक बार जब आप संपादन से खुश हो जाते हैं, जैसा कि मैंने ऊपर उल्लेख किया है, C-c C-eवास्तविक बफ़र्स में परिवर्तनों को "प्रतिबिंबित" करने के लिए करते हैं। बफ़र्स को अभी तक नहीं बचाया गया है।

  • सभी बफ़र्स को बचाने के लिए, मैं आमतौर पर एक ही बार में, एमएसीएस डिफ़ॉल्ट C-x s !बाइंडिंग का उपयोग करता हूं ।

यहाँ स्क्रीनशॉट के साथ एक उदाहरण का उपयोग मामला है:

यह के सभी उदाहरणों बदलने की प्रक्रिया से पता चलता bind-to-modi-mapकरने के लिए bind-to-my-mapमेरे में ~/.emacs.d/

जब मैं bind-to-modi-mapअपने emacs सेटअप फ़ोल्डर में खोज करता हूं, तो मुझे नीचे 'एग्ड रिजल्ट मिलता है:एजी परिणाम, unmodified

यह बफ़र केवल-पढ़ने के लिए है।

इसके बाद M-x wgrep-change-to-wgrep-mode, मैं -modi-mapउस चयन के सभी उदाहरणों को हाइलाइट करता हूं, M-x mc/mark-all-like-thisउन चयनों को संपादित करने के बाद -my-map, यह निम्नानुसार दिखता है: एजी परिणाम, कई-कर्सर का उपयोग करके संशोधित

ब्लू हाइलाइट दिखाता है कि प्रेस करते समय कौन सी लाइनें संशोधित होंगी C-c C-e

मारने पर C-c C-e, आप इस स्क्रीनशॉट में वास्तविक फ़ाइल में परिलक्षित परिवर्तन देख सकते हैं: एजी परिणाम, संपादन खत्म करने के बाद

मैं तो सभी संशोधित फ़ाइलों का उपयोग कर बचाना होगा C-x s !


यह वास्तव में स्ट्रिंग रिप्लेस करने का सबसे अच्छा तरीका है। एक परियोजना से जुड़ा, एजी-बहिष्कृत दिमाग, बैच करने में आसान, अभी भी यह सत्यापित करने में सक्षम है कि आप सही चीज़ की जगह ले रहे हैं।
पास्कलवीकूटेन

13

जो मैं करना चाहता हूं वह या तो जल्दी से मौजूदा grep आउटपुट [...] से एक dired बफर बनाना है, या grep आउटपुट को मल्टी-होने [...] के लिए बफ़र्स की सूची में बदलना है।

आपको grep परिणाम बफ़र को किसी भी चीज़ में परिवर्तित करने की आवश्यकता नहीं है, विशेष रूप से grep आउटपुट को संपादित करने के लिए पहले से ही एक मोड है (और निश्चित रूप से फ़ाइलों पर परिवर्तनों को दर्शाती है)।

  1. Melpa से wgrep पैकेज स्थापित करें ।
  2. (require 'wgrep) आपकी init फ़ाइल में।
  3. एक grep खोज करने के बाद, हिट C-c C-pकरें और दूर संपादित करें!
  4. के साथ अपने संपादन सहेजें C-c C-e

यहां तक ​​कि यह ऐक और एजी के साथ भी काम करता है।


2
यही मैं (ag.el के साथ) करता हूं। साथ में मैग्नीस मल्टीकेसर एडिटिंग सरल रिफ्लेक्टरिंग वास्तव में आसान है।
टॉम रीजनर

4

यह कार्यक्षमता प्रक्षेप्य ( projectile-replace) के भीतर मौजूद है । यह एग / ack / git grep / grep का उपयोग करेगा यदि उपलब्ध (उस क्रम में) घटनाओं को खोजने के लिए, और tags-query-replaceक्वेरी-प्रतिस्थापित को निष्पादित करने के लिए।


वही मुद्दों से ग्रस्त है जैसे कि खोज-grep-dired। यह मौजूदा grep आउटपुट का उपयोग नहीं कर रहा है। प्रोजेक्टाइल-मल्टी-होने के साथ समान समस्याएं हैं। मैं मैचों की सूची को देखने के बाद क्वेरी को शुरू करना पसंद करूंगा और अंतर्निहित खोज की विधि को नहीं बदलूंगा। हालांकि यह एक वैकल्पिक वर्कफ़्लो है।
dgtized

आप जो ध्वनियों का वर्णन कर रहे हैं, वह आसानी से पाठ को बदलने और बार-बार कॉल करने के लिए M-g n C-x e(यानी, next-errorघटनाओं के माध्यम से स्क्रॉल करने के लिए उपयोग) को पूरा करके एक बहुत तेज मैक्रो बनाकर आसानी से पूरा किया जा सकता है ।
शोस्ती

1

यहाँ एक और तरीका है, आइकल्स का उपयोग करना ।

अपने Emacs *grep*आउटपुट बफ़र में, Cc `(जो Cc बैकक्वाउट है) को हिट करें, जो कि Icicle मोड में बफर *grep*टू कमांड के लिए बाध्य है icicle-compilation-search। यह आपको grepकिसी भी क्रम में किसी भी खोज हिट ( हिट) को जल्दी से नेविगेट करने देता है ।

इनपुट जो आप मिनीबफ़र डायनामिक फ़िल्टर (नार्स) में खोज हिट्स के सेट में टाइप करते हैं, और आप क्रमिक रूप से कई पैटर्न (जैसे सब्सट्रिंग, रीजैक्स) का मिलान करके संकीर्ण को पूरा करने के लिए उपयोग कर सकते हैं ।

जब खोज हिट के बीच नेविगेट करते हैं, तो आप उनमें से किसी को भी मांग पर बदल सकते हैं - या तो पूरे हिट (लाइन) या सिर्फ आपके वर्तमान मिनीबफ़र इनपुट से मेल खाते भाग।

आइकल्स सर्च देखें - संकलन या Grepइकोल्स खोज के लिए एक परिचय यहाँ है , और इकील्स खोज के दौरान मैचों की जगह के बारे में जानकारी यहाँ है


0

मैं इस उपयोग का उपयोग करता हूं मैंने xah_find.el लिखा है

मैंने इसे लिखा है क्योंकि:

  • विशुद्ध रूप से। विंडोज या यूनिकोड ट्रांसमिशन पर जीआरपी के बारे में कोई चिंता नहीं है जो ईएमएसी से ऑपरेटिंग सिस्टम के बीच है। emacs grep समस्या
  • यदि आप भारी यूनिकोड उपयोगकर्ता हैं, तो यूनिक्स उपकरण में कुछ अर्ध-बग होते हैं। linux uniq समस्या
  • मैं हर हफ्ते 5k फाइलों को ढूंढता / प्रतिस्थापित करता हूं। मैं वर्षों से dired-do-query-replace-regexp का उपयोग कर रहा था। मुझे लगता है कि इंटरेक्टिव प्रकृति ने वास्तव में मेरा समय बदल दिया है, फिर भी मुझे परिवर्तनों के परिणामों की जांच करने की आवश्यकता है। इसलिए, मेरा समाधान अब बैच चलाया जा रहा है, लेकिन एक अच्छी रिपोर्ट है कि मैं फ़ाइल को लिखने के विकल्प के साथ सभी खोज / परिणाम को स्कैन कर सकता हूं।

यह लाजवाब उपयोग शायद 5 से 10 गुना धीमा है क्योंकि एमिक्स में यूनिक्स ग्रीप कहलाता है, लेकिन मेरे लिए ठीक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.