क्षेत्र के चारों ओर दिए गए पाठ को कैसे लपेटें


11

मेरे पास अक्सर एक ऐसी स्थिति होती है जहां मुझे एक क्षेत्र के चारों ओर पाठ लागू करने की आवश्यकता होती है। HTML और सरल मामलों के लिए इसके लिए पहले से ही लाइब्रेरी हैं। लेकिन सामान्य मामले के बारे में क्या? मुझे यह पूछा जाना चाहिए कि मैं इस क्षेत्र की शुरुआत और अंत क्या करने जा रहा हूं।


क्या आप एक बार, या एक जोड़ी जोड़े को कई बार मनमानी सामग्री डालने के लिए इसका उपयोग करना चाहते हैं? बाद के मामले में, स्मार्टप्रेन जैसे पुस्तकालय उपयोगी साबित हो सकते हैं, और उन्हें कस्टम जोड़े के साथ बढ़ाया जा सकता है। उदाहरण के लिए, आप एक जोड़ी जोड़ सकते हैं <?php... ?>, और फिर, जब आप एक क्षेत्र और प्रकार <?php(या एक कीबाइंडिंग) का चयन करते हैं, तो यह जोड़ी में लिपटा होता है। लेकिन afaik इन पुस्तकालयों का उपयोग करने का कोई आसान तरीका नहीं है यदि आपके पास कई एक-शॉट जोड़े हैं।
टी। वेरॉन

@ टी। वेरॉन: मुझे पता है कि वे मौजूद हैं। लेकिन उन क्षणों के लिए जब कोड के माध्यम से जाने और एक सामान, सामान्य, पुन: प्रयोज्य फ़ंक्शन के माध्यम से जाने की अनूठी आवश्यकता होती है
nperson325681

जवाबों:


6

मैं चारों ओर घूम गया और जॉन डी। कुक ने इस पोस्ट को पाया । वह दर्शाता है कि एचटीएमएल / एक्सएमएल टैग को क्षेत्र के आसपास आसानी से प्राप्त करने के लिए एक सरल इंटरैक्टिव फ़ंक्शन का निर्माण कैसे करें। इससे मैंने दो बार पूछने के लिए फ़ंक्शन को संशोधित किया।

(defun tag-word-or-region (text-begin text-end)
  "Surround current word or region with given text."
  (interactive "sStart tag: \nsEnd tag: ")
  (let (pos1 pos2 bds)
    (if (and transient-mark-mode mark-active)
        (progn
          (goto-char (region-end))
          (insert text-end)
          (goto-char (region-beginning))
          (insert text-begin))
      (progn
        (setq bds (bounds-of-thing-at-point 'symbol))
        (goto-char (cdr bds))
        (insert text-end)
        (goto-char (car bds))
        (insert text-begin)))))

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

(defun tag-php ()
  (interactive)
  (tag-word-or-region "<?php " "?>"))

Btw, जिस तरह से यह कुछ सीमा मामलों को संभालता है वह इष्टतम नहीं है; शुरुआत के लिए खोज कभी-कभी विफल हो सकती है और अंत में दोनों टैग छोड़ सकती है। यह हो सकता है evilकि मैं यहां हस्तक्षेप करता हूं। शायद प्रकार के एक फ़ंक्शन interactive "r" ने अधिक मजबूती से काम किया?
nperson325681

4

मैं एक अलग दृष्टिकोण का सुझाव दूंगा। जब कोई क्षेत्र होता है, तो परिभाषा के अनुसार क्षेत्र pointकी शुरुआत (या अंत) होनी चाहिए, और markअंत में (या शुरुआत) होगी। इसका मतलब है कि आप उस बिंदु पर इच्छित पाठ दर्ज कर सकते हैं, और फिर उपयोग कर सकते हैं exchange-point-and-mark, अर्थात C-x C-x, इस क्षेत्र के दूसरे छोर पर जाने के लिए। अपने आवरण का दूसरा भाग दर्ज करें और आपका काम हो गया।

आपको सम्मिलन पाठ के लिए स्पष्ट रूप से पूछा गया संकेत नहीं मिलता है, लेकिन मैं कल्पना नहीं कर सकता कि कम प्रयास के साथ एक ही बात को पूरा करने का एक तरीका होगा।


यदि प्रारंभ और अंत पाठ समान है, तो मुझे आश्चर्य होता है कि क्या multiple-cursorsसक्रिय क्षेत्र के आरंभ और अंत में एक साथ पाठ सम्मिलित करने के लिए कुछ दिया जा सकता है।
19

यह मैनुअल तरीके से लगता है कि कम संपादकों के उपयोगकर्ताओं को वैसे भी करने के लिए मजबूर किया जाता है। वैसे भी मैं आपके जवाब से एक सबक के रूप में मैक्रोज़ का उपयोग पढ़ता हूं, कहना होगा। मुझे आपकी शैली पसंद है
nperson325681

1
@progo - धन्यवाद :) यह एक अधिक मैन्युअल दृष्टिकोण की तरह लगता है , लेकिन यह वास्तव में आपके विकल्प की तुलना में कम कीस्ट्रोक्स का उपयोग करता है । इस दृष्टिकोण के साथ, रैपिंग पाठ के अलावा, आपको केवल आवश्यकता है C-x C-x। आपके उत्तर के साथ, आपको अपने फ़ंक्शन ( C-c something) को कॉल करने की आवश्यकता है , और आपको returnप्रत्येक प्रविष्टि के बाद हिट करने की भी आवश्यकता है । तो कोई फर्क नहीं पड़ता कि आप क्या करते हैं, आपको दो और कीस्ट्रोक्स मिले हैं। उस ने कहा, यह मदद नहीं करता है अगर आप चाहते हैं कि कुछ और से कॉल करें।
टायलर

3

केवल विविधता के लिए:

एक और तरीका है कुछ मनमाने ढंग से आरंभ और अंत पाठ के साथ यह करने के लिए उपयोग करने के लिए किया जाएगा replace-regexpपर क्षेत्र: मैच .+और के साथ बदलें before \& after, या आप के लिए उपयोग करना चाहते हैं जो कुछ भी पाठ beforeऔर after

आप ऐसा करने के लिए एक कमांड लिख सकते हैं, लेकिन मैं एक ऐसे मामले के बारे में सोच रहा हूं, जहां दिए गए फ़ाइल में आप एक ही स्टार्ट / एंड टेक्स्ट को कई जगहों पर लागू करना चाहते हैं। आप किसी मैक्रो को रिकॉर्ड कर सकते हैं या किसी अन्य क्षेत्र पर दोहराने के लिए मिनीबफ़र इतिहास का उपयोग कर सकते हैं।

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

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