2011-06-30 11 views
8

मेरे बहुत सारे काम में कोड की अनावश्यक रेखाओं को खोजना और हटाना शामिल है। तो मैं एक मैक्रो बना देता हूं, और फिर सभी लाइनों (C-x h) का चयन करें और फिर (apply-macro-to-region-lines) आदेश चलाएं। मैं उस आदेश को सहेजने में कामयाब रहा और इसे .emacs फ़ाइल में रखा; मैंने इसे cut_it_now कहा। लेकिन अब मेरा काम अब मैक्रो नहीं है, इसलिए मैं अब (apply-macro-to-region-lines) फ़ंक्शन का उपयोग नहीं कर सकता। क्या आप जानते हैं कि (apply-function-to-region-lines) कहीं भी लागू किया गया है?क्या Emacs में कोई लागू-कार्य-से-क्षेत्र-रेखाएं हैं?

बहुत धन्यवाद,

डी

उत्तर

2

मैं @ Lindydancer के उत्तर से सहमत हूं, और मैं यह भी जोड़ूंगा कि आपका लक्ष्य पूरा करने का एक आसान तरीका हो सकता है। जैसे अंतर्निहित फ़ंक्शन delete-matching-lines। :-)

+0

sanityinnc धन्यवाद! – dola

3

एक सरल समाधान एक मैक्रो कॉल है कि आपके समारोह तो अच्छा ol 'apply-macro-to-region-lines का उपयोग परिभाषित करने के लिए है।

इसके अलावा, मुझे लगता है कि आप elisp की कुछ पंक्तियों में एक लूप लिख सकते हैं जो वास्तव में आप पूछते हैं। यदि आप फैंसी बनना चाहते हैं, तो आप उपयोगकर्ता को फ़ंक्शन के नाम के लिए भी संकेत दे सकते हैं। मुझे लगता है कि यह elisp के लिए एक अच्छा अभ्यास है, अगर आप ऐसा महसूस करते हैं कि आप इसे स्वयं करना चाहते हैं तो मैं कुछ पॉइंटर्स के साथ आपकी मदद कर सकता हूं।

5

ध्यान दें कि आप अभी भी apply-macro-to-region-lines का उपयोग कोड से उत्पन्न मैक्रो के साथ कर सकते हैं, प्रदान किया गया मैक्रो को वेक्टर या स्ट्रिंग के रूप में परिभाषित किया गया है। एक कस्टम apply-named-macro-to-region-lines [2] के साथ, आप इंटरैक्टिव रूप से उपयोग करने के लिए मैक्रो का चयन कर सकते हैं।

Emacs के नाम पर उपयोग की जाने वाली विधि के आधार पर कीबोर्ड मैक्रो से कोड उत्पन्न करने के दो तरीके हैं।

आप kmacro-name-last-macro (सी-एक्ससी-कश्मीरn करने के लिए बाध्य) का उपयोग करते हैं, तो Emacs एक समारोह मैक्रो है, जो इस विशेष उद्देश्य के लिए सीधे उपयोगी नहीं है से उत्पन्न करता है [1]।

यदि आप अपने मैक्रो नाम देने के लिए name-last-kbd-macro का उपयोग करते हैं, तो यह एक वेक्टर या स्ट्रिंग के रूप में उत्पन्न किया जाएगा।

किसी भी मामले में, तो आप कोड प्राप्त करने के लिए insert-kbd-macro का उपयोग करें।

वास्तव में वेक्टर/स्ट्रिंग प्रारूप, डिफ़ॉल्ट है ताकि आप नामकरण चरण को बायपास और तुरंत कोड के लिए पूछ सकते मैन्युअल रूप से (सबसे हाल ही में परिभाषित मैक्रो को इंगित करने के नाम प्रॉम्प्ट पर आरईटी टाइपिंग), और फिर सम्मिलित कोड का डिफ़ॉल्ट नाम संपादित करें।

[1]: वेक्टर फॉर्म केवल फ़ंक्शन परिभाषा में एम्बेड किया गया प्रतीत होता है, इसलिए आप कोड से इसे निकालने में सक्षम होना चाहिए ताकि वेक्टर प्रारूप में मैक्रो फ़ंक्शन को मैन्युअल रूप से फिर से परिभाषित कर सकें।

[2]: जब मैंने मूल रूप से यह उत्तर लिखा था, तो मैं भूल गया था कि यह एक कस्टम फ़ंक्शन था। उसके लिए माफ़ करना।

(defun apply-named-macro-to-region-lines (top bottom) 
    "Apply named keyboard macro to all lines in the region." 
    (interactive "r") 
    (let ((macro (intern 
       (completing-read "kbd macro (name): " 
           obarray 
           (lambda (elt) 
            (and (fboundp elt) 
             (or (stringp (symbol-function elt)) 
              (vectorp (symbol-function elt)) 
              (get elt 'kmacro)))) 
           t)))) 
    (apply-macro-to-region-lines top bottom macro))) 
-1

तुम हमेशा apply-macro-to-region-lines के स्रोत को कॉपी करें और एक समारोह में पारित कहते हैं, और इस प्रकार अपने स्वयं के संस्करण बनाने के लिए tweak कर सकते हैं।, तो

(defun apply-function-to-region-lines (fn) 
    (interactive "aFunction to apply to lines in region: ") 
    (save-excursion 
    (goto-char (region-end)) 
    (let ((end-marker (copy-marker (point-marker))) 
      next-line-marker) 
     (goto-char (region-beginning)) 
     (if (not (bolp)) 
      (forward-line 1)) 
     (setq next-line-marker (point-marker)) 
     (while (< next-line-marker end-marker) 
     (let ((start nil) 
       (end nil)) 
      (goto-char next-line-marker) 
      (save-excursion 
      (setq start (point)) 
      (forward-line 1) 
      (set-marker next-line-marker (point)) 
      (setq end (point))) 
      (save-excursion 
      (let ((mark-active nil)) 
       (narrow-to-region start end) 
       (funcall fn) 
       (widen))))) 
     (set-marker end-marker nil) 
     (set-marker next-line-marker nil)))) 

आप निम्नलिखित समारोह है कि आप एक बफर में लाइनों के खिलाफ लागू करना चाहते हैं, तो:

2

निम्नलिखित समारोह आप क्या चाहते हैं क्या करना चाहिए

(defun test() 
    (insert "> ")) 

और, यदि आपके बफर में निम्नलिखित सामग्री शामिल हैं:

Line 1: blah, blah 
Line 2: blah, blah 
Line 3: blah, blah 
Line 4: blah, blah 

यदि आप केवल एक क्षेत्र का चयन करते हुए एक क्षेत्र का चयन करते हैं 2 & 3, दर्ज "एम एक्स लागू-समारोह करने के लिए क्षेत्र लाइनों", और संकेत दिए समारोह नाम के रूप में "परीक्षण" दर्ज करते हैं, तो आपको निम्न परिणाम अपने बफर में मिल जाएगा:

Line 1: blah, blah 
> Line 2: blah, blah 
> Line 3: blah, blah 
Line 4: blah, blah 
+0

आप प्रत्येक पंक्ति को क्यों सीमित करते हैं? – ceving

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