केवल चयनित क्षेत्र में कमांड लागू करने के लिए


18

कहो, मेरे पास कुछ कोड है:

(defun some-function ()
  (interactive)
  ;; do something
  )

अब मैं some-functionबफर में केवल चयनित क्षेत्र पर काम करना चाहता हूं ? मैं उसे कैसे कर सकता हूँ ? साथ ही, यदि मैंने कुछ क्षेत्र का चयन किया है और यदि मैंने चयन नहीं किया है, तो कुछ करने के लिए दो अलग-अलग कोड पथ हो सकते हैं।

जवाबों:


22
(defun some-function (beginning end)
  (interactive "r")
  (if (use-region-p)
      (message "The region is active, and is from %d to %d" beginning end)
    (message "The region is still there (from % d to %d), but it is inactive" 
             beginning end)))

उपयोग का (interactive "r")मतलब है कि पैरामीटर beginningऔर endस्वचालित रूप से क्षेत्र के मूल्यों को प्राप्त करेंगे और क्षेत्र अंत में क्रमशः, जब फ़ंक्शन को लागू किया जाता है। (आप क्रमशः कार्यों region-beginningऔर region-end, का उपयोग करके कभी भी उन मूल्यों को प्राप्त कर सकते हैं।)

यह क्षेत्र हमेशा मौजूद रहता है (यदि वर्तमान बफर में कोई निशान है), लेकिन आप यह नहीं सोच सकते कि यह है। यह हाइलाइट होने पर क्षेत्र सक्रिय होता है (पाठ का चयन किया जाता है)। आप परीक्षण कर सकते हैं कि क्या क्षेत्र विधेय का उपयोग करके सक्रिय है या नहीं region-active-p। लेकिन बेहतर परीक्षण आमतौर पर होता है use-region-p, क्योंकि (डिफ़ॉल्ट रूप से) यह nilतभी सही (गैर- ) होता है, जब क्षेत्र सक्रिय और गैर-रिक्त दोनों होता है (बिंदु और चिह्न भिन्न होते हैं)।

मूल रूप से, इस क्षेत्र का कोई आकर्षण नहीं था। और लंबे समय तक, भले ही हाइलाइटिंग उपलब्ध थी, यह डिफ़ॉल्ट व्यवहार नहीं था। होने के लिए हाइलाइटिंग के लिए, आपको transient-mark-modeचालू होना चाहिए (या कम से कम अस्थायी रूप से चालू)। डिफ़ॉल्ट रूप से, transient-mark-modeहाल के Emacs संस्करणों में चालू होता है।

यह विधेय की परिभाषा को देखने के लिए उपयोगी है use-region-p:

(defun use-region-p ()
  (and (region-active-p)
       (or use-empty-active-region
           (> (region-end) (region-beginning)))))

use-empty-active-regionएक उपयोगकर्ता विकल्प है, जिसका डिफ़ॉल्ट मान nil(सत्य) है, जिसका अर्थ है कि डिफ़ॉल्ट रूप use-region-pसे क्षेत्र सही होने पर वापस नहीं आएगा। उस स्थिति में, इसे सच करने के लिए, क्षेत्र का अंत शुरुआत से अधिक होना चाहिए (जैसा कि मैंने ऊपर वर्णित व्यवहार)।

और अगर हम इसकी परिभाषा देखें region-active-p:

(defun region-active-p ()
  (and transient-mark-mode
       mark-active
       (mark)))

हम देखते हैं कि यह सच है (गैर- nil) जब ये सभी सच होते हैं:

  • transient-mark-mode चालू है।
  • चिह्न सक्रिय है ( mark-active)।
  • वर्तमान बफर में एक निशान है।

सक्रिय होने का चिह्न वास्तव में क्या सक्रिय क्षेत्र है। जब यह सक्रिय होता है, तो यह मान transient-mark-modeलिया जाता है कि वर्तमान बफर में एक निशान है, इस क्षेत्र पर प्रकाश डाला गया है।


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

1
@ AndreasRöhler: नहींं। C-SPC M-: mark-active=> टी। आपके पास निश्चित रूप से एक खाली क्षेत्र हो सकता है जो फिर भी सक्रिय है।
ड्रयू

ठीक है शुक्रिया। अभी भी लगता है कि निशान-सक्रिय और क्षेत्र-सक्रिय-पी - परिष्कृत के रूप में अधिक से अधिक शून्य - सभी की आवश्यकता होनी चाहिए।
एंड्रियास रोहलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.