टेक्स्ट को स्वैप करने के लिए खोज / प्रतिस्थापन जैसी सुविधा


12

मैं अक्सर अपने आप को जैसे बदलने का प्रयास करने लगता है fooके साथ barऔर barसाथ fooएक बफर में।

जिस तरह से मैं आमतौर पर ऐसा करता हूं:

  • 3 प्रश्न-बदल देता है: aaa -> @@@, bbb -> aaa,@@@ -> bbb
  • स्वचालन पर छोड़ दें और बस हाथ से प्रतिस्थापन करें

मुझे लगता है कि मिलान स्ट्रिंग है या नहीं, यह परखने के लिए ,सिंटैक्स का उपयोग करके कुछ काम करना संभव query-replace-regexpहै । लेकिन परिणामी वाक्य रचना बहुत बोझिल होगी, इसलिए मैंने वास्तव में कभी इसकी कोशिश नहीं की।aaabbb

बात यह है कि यह कितना आम काम है, मुझे लगता है कि एक बेहतर, एकल-चरण, इसे करने का तरीका, या तो मौजूदा पैकेज में या तो होना चाहिए। है?


एक सिंगल-स्टेप तरीका हो सकता है, लेकिन आपका पहला तरीका खराब नहीं है, IMO। और यदि आप रिप्लेसमेंट स्ट्रिंग को चुनते हैं तो आप दूसरे पास के लिए नो-क्वेरी रिप्लेसमेंट कर सकते हैं।
ड्रू

@ ड्रू रेगुलर के लिए query-replace, मुझे पता है कि आमतौर पर M-% str1 str2इस बिंदु को स्थानांतरित करने और हाथ से परिवर्तन करने की तुलना में तेजी से होता है। यह अच्छा है, क्योंकि मुझे यह सोचने में समय बर्बाद करने की ज़रूरत नहीं है कि सबसे तेज़ क्या होगा, भले ही वहाँ केवल एक घटना हो str1। आदर्श रूप से, मैं पाठ उलटा करना चाहूंगा, जितना जल्दी हो सके, ताकि मैं इसके बारे में सोचे बिना भी इसका उपयोग कर सकूं।
टी। वेरॉन

कोई सरल उत्तर देगा। आप कोई संदेह नहीं कर सकते हैं कि आप क्या पूछते हैं, जैसे, प्रतिस्थापन के लिए एक लिस्प अभिव्यक्ति का उपयोग करके, पाठ को प्रतिस्थापित करने के लिए संदर्भित करना। जैसे, स्वैप मुहावरे के समान कुछ का उपयोग करें (setq a (prog1 b (setq b a)))। और एक सरल तरीका भी हो सकता है।
ड्रू

2
मैं \,(if \1 "b" "a")विशेष रूप से बदसूरत नहीं लगता (एक regexp के खिलाफ \(a\)\|b), लेकिन फिर भी शब्दों को दो बार टाइप करना पड़ता है, अगर वह आपको परेशान करता है।
पॉलिट्जा

2
क्यों नहीं \(aaa\)\|bbb?
पॉलिट्जा

जवाबों:


8

यहाँ एक छोटी सी कमांड है जो यह करेगी:

(defun query-swap-strings (from-string to-string &optional delimited start end)
  "Swap occurrences of FROM-STRING and TO-STRING."
  (interactive
   (let ((common
          (query-replace-read-args
           (concat "Query swap"
                   (if current-prefix-arg
                       (if (eq current-prefix-arg '-) " backward" " word")
                     "")
                   (if (use-region-p) " in region" ""))
           nil)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
           (if (use-region-p) (region-beginning))
           (if (use-region-p) (region-end)))))
  (perform-replace
   (concat "\\(" (regexp-quote from-string) "\\)\\|" (regexp-quote to-string))
   `(replace-eval-replacement replace-quote (if (match-string 1) ,to-string ,from-string))
   t t delimited nil nil start end))

धन्यवाद, इस तरह से मैं अपने आप को लिखा होगा की तुलना में अधिक विस्तृत है! हो सकता है कि आप कार्यान्वित सुविधाओं के बारे में विस्तार से बता सकें? मुझे लगता है कि उपसर्ग तर्क के साथ आप पीछे की ओर जाते हैं, कि यह केवल जरूरत पड़ने पर क्षेत्र में प्रतिस्थापित करता है ... या क्या यह query-replaceउलटा के लिए सिर्फ एक पुनर्लेखन है , ताकि यह अपनी सभी विशेषताओं को बरकरार रखे? यह मेरे emacs में 100% की परिभाषा से मेल नहीं खाता है, लेकिन मैं अभी भी 24.5 के साथ हूं ...
टी। वेरॉन

@ T.Verron यह query-replaceनवीनतम संस्करण से कार्यों के परिवार से सिर्फ एक मानक निकाय है , इसलिए यह सभी सुविधाओं को बरकरार रखता है। फ़ंक्शन के अंत तक मैंने Emacs मैनुअल में उल्लिखित स्ट्रैपिंग स्वैपिंग के अपने अनुशंसित तरीके को जोड़ा।
link0ff

मैंने शायद बहुत तेजी से स्वीकार किया। फ़ंक्शन केवल यहां काम करता है (24ac emacs) अगर मैं टिप्पणी करता हूं backwardऔर region-noncontiguous-pकॉल से perform-replace। क्या यह एक सामान्य समस्या है, या इसका मतलब यह है कि इंटरफ़ेस perform-replaceसंस्करणों के बीच बदल गया है?
टी। वेरॉन

हां, नवीनतम संस्करण में जोड़े गए इन 2 तर्कों के साथ इंटरफ़ेस बदल गया है, इसलिए वे पहले वाले में मौजूद नहीं हैं,
link0ff

2
यह समाधान भी अब ठीक लग रहा है।
नाम

9

प्लूर स्थापित करें

और कमांड चलाएं plur-query-replace

और इनपुट {foo,bar}और उसके प्रतिस्थापन{bar,foo}

yवांछित के रूप में घटनाओं को बदलने के लिए मारो ।

इस कमांड के नॉन-इंटरेक्टिव, और आईसर्च जैसे वेरिएंट भी हैं।


धन्यवाद! प्लूर का उद्देश्य भी कुछ ऐसा है जिसे मैं कभी-कभी देख रहा हूं, मैं निश्चित रूप से इस पर एक नजर डालूंगा। ऊपर के पैकेज के लेखक की टिप्पणी से मेरी केवल हिचकिचाहट उपजी है ...;)
टी। वेरॉन

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