2012-05-15 11 views
20

मुझे Emacs बफर में चयन तक पहुंचने की आवश्यकता है। मुझे यह आलेख How do I access the contents of the current region in Emacs Lisp? मिला है और यह मुझे बहुत मदद करता है।मैं Emacs Lisp में प्रोग्रामेटिक रूप से क्षेत्र (चयन) कैसे प्राप्त करूं?

लेकिन एक समस्या है। पहली बार जब मैं एक क्षेत्र का चयन करता हूं (हाइलाइट करता हूं), यह ठीक काम करता है, लेकिन जब मैं सीजी दबाता हूं, और किसी भी वर्ण को हाइलाइट किए बिना कर्सर को सामान्य रूप से किसी अन्य स्थान पर ले जाता हूं, तो मुझे अंतिम बिंदु से वर्तमान बिंदु तक एक स्ट्रिंग मिलती है जबकि मैं एक खाली उम्मीद करता हूं ।

असल में मुझे एक फ़ंक्शन को कार्यान्वित करने की आवश्यकता है जो वर्तमान चयन (हाइलाइट) को एक स्ट्रिंग के रूप में वापस लाएगा, या खाली स्ट्रिंग अगर कुछ भी हाइलाइट नहीं किया गया है। निम्नलिखित कोड मुझे और स्पष्ट रूप से व्यक्त कर सकता है।


(defun get-search-term() 
    (interactive) 
    (let (
     (selection (buffer-substring-no-properties (region-beginning) (region-end)))) 
    (if (= (length selection) 0) 
     (message "empty string") 
     (message selection)))) 

कोई सुझाव? आपका बहुत बहुत धन्यवाद!

+1

कोई कारण नहीं है कि आप गैरेथ रीस द्वारा दिखाए गए 'इंटरैक्टिव' फॉर्म का उपयोग नहीं कर रहे हैं, जिसमें आपने लिंक किया था? – phils

+0

आपके उत्तर के लिए धन्यवाद, और उस लेख को ध्यान से पर्याप्त रूप से पढ़ने के लिए खेद है। (इंटरैक्टिव "आर") ने मेरी समस्या हल कर दी है। मुझे इंटरैक्टिव के बारे में और अधिक पढ़ने की जरूरत है। – sailing

+1

संभावित डुप्लिकेट [मैं Emacs Lisp में वर्तमान क्षेत्र की सामग्री तक कैसे पहुंच सकता हूं?] (Http://stackoverflow.com/questions/605846/how-do-i-access-the-contents-of-the-current -region-in-emacs-lisp) – phils

उत्तर

24

"आर" इंटरैक्टिव का विनिर्देश गूंगा है। तुम देख रहे हो क्यों।

(defun get-search-term (beg end) 
    "message region or \"empty string\" if none highlighted" 
    (interactive (if (use-region-p) 
        (list (region-beginning) (region-end)) 
       (list (point-min) (point-min)))) 
    (let ((selection (buffer-substring-no-properties beg end))) 
    (if (= (length selection) 0) 
     (message "empty string") 
     (message selection)))) 

मेरा मतलब "बेवकूफ" बेवकूफ और उपयोगी नहीं है; सिर्फ यह कि परवाह नहीं है कि यह चिह्न सक्रिय है या नहीं। मुझे लगता है कि यह क्षणिक-चिह्न-मोड की भविष्यवाणी करता है।

संपादित: का प्रयोग (point-min) दो बार ऊपर कोड कठिन बना देता है समझने के लिए जब फिर से पढ़ने। यहां एक बेहतर कार्यान्वयन है:

(defun get-search-term (beg end) 
    "message region or \"empty string\" if none highlighted" 
    (interactive (if (use-region-p) 
        (list (region-beginning) (region-end)) 
       (list nil nil))) 
    (message "%s" (if (and beg end) 
        (buffer-substring-no-properties beg end) 
        "empty string"))) 
+0

दूसरा बिंदु-मिनट बिंदु-अधिकतम होना चाहिए, मुझे लगता है। – ramen

+0

@ramen मैंने बस इसे सही किया। मैं प्रश्न को फिर से पढ़ता हूं, और बिंदु-मिनट सही है क्योंकि यह एक खाली स्ट्रिंग उत्पन्न करता है। –

+0

अब मैंने एक और अधिक समझने योग्य कार्यान्वयन जोड़ा है। –

1

परिवर्तनीय मार्क-सक्रिय उदाहरण देखें। सी-एच वी मार्क-सक्रिय

==> मार्क-सक्रिय 'सी स्रोत कोड' में परिभाषित एक चर है। इसका मूल्य शून्य स्थानीय बफर Apropos; वैश्विक मूल्य शून्य

किसी भी फैशन में सेट होने पर स्वचालित रूप से बफर-स्थानीय बन जाता है।

प्रलेखन: गैर-शून्य का अर्थ है कि इस बफर में वर्तमान में मार्क और क्षेत्र सक्रिय हैं।

(defun get-search-term() 
    (interactive) 
    (if mark-active 
     (let (
     (selection (buffer-substring-no-properties (region-beginning) (region-end)))) 
    (if (= (length selection) 0) 
     (message "empty string") 
     (message selection)) 
    ) 
    (error "mark not active")) 
) 
+2

'मार्क-एक्टिव' केवल तभी काम करेगा यदि आप क्षणिक-चिह्न-मोड का उपयोग करते हैं, इसलिए यह आपके स्वयं के उपयोग के लिए ठीक है, लेकिन यदि कोड दूसरों द्वारा उपयोग योग्य होना चाहिए, तो आपको 'क्षेत्र-सक्रिय-पी' (या 'उपयोग' का उपयोग करना चाहिए -region-p') इसके बजाए। – Stefan

संबंधित मुद्दे