मैं emacs में एक महत्वपूर्ण संयोजन के लिए एक नियमित अभिव्यक्ति कैसे बांधूं?

संदर्भ के लिए, मैं एक emacs नौसिखिया हूँ। मैंने इसे बहुत लंबे समय तक उपयोग नहीं किया है, लेकिन इसे अधिक से अधिक उपयोग कर रहा हूं (मुझे यह बहुत पसंद है)। इसके अलावा मैं lisp के साथ सहज हूँ, लेकिन elisp से सुपर परिचित नहीं है।

मुझे जो करना है वह कुंजीपटल संयोजन के लिए एक नियमित अभिव्यक्ति बांधना है क्योंकि मैं इस विशेष रेगेक्स का उपयोग अक्सर करता हूं।

मैं क्या कर रहा हूं:

M-C-s ^.*Table\(\(.*\n\)*?GO\)

नोट, मैंने उपरोक्त न्यूलाइन का उपयोग किया है, लेकिन मुझे लगता है कि isearch-forward-regexp के लिए, आपको वास्तव में \ n को नियमित अभिव्यक्ति में बदलने की आवश्यकता है जिसके परिणामस्वरूप सीक्यू क्यूजे । यह एक शाब्दिक न्यूलाइन (कमांड को समाप्त किए बिना) को अभिव्यक्ति में एक नई लाइन डालने और लाइनों से मेल खाने में सक्षम बनाता है।

मैं इसे एक महत्वपूर्ण संयोजन से कैसे बांध सकता हूं?

मैं अस्पष्ट रूप से समझता हूं कि मुझे एक elisp फ़ंक्शन बनाने की आवश्यकता है जो अभिव्यक्ति के साथ isearch-forward-regexp निष्पादित करता है, लेकिन मैं विवरण पर अस्पष्ट हूं। मैंने Google की खोज की है और अधिकतर दस्तावेज को भ्रमित करने के लिए पाया है।

मैं emacs में एक महत्वपूर्ण संयोजन के लिए एक नियमित अभिव्यक्ति कैसे बांध सकता हूं?


Mike Stone had the best answer so far -- not exactly what I was looking for but it worked for what I needed

संपादित करें - इस प्रकार का काम किया, लेकिन मैक्रो को संग्रहीत करने के बाद, जब मैं इसे बाद में उपयोग करने के लिए वापस गया, तो मैं इसे सी-एक्स ई के साथ उपयोग नहीं कर सका। (यानी, अगर मैं emacs को रीबूट करता हूं और फिर एमएक्स मैक्रो-नाम टाइप करता हूं, और उसके बाद cx e , मुझे मिनीबफर में कोई संदेश नहीं मिलता है जैसे 'कोई अंतिम Kbd मैक्रो' या कुछ नहीं समान)


@ माइक स्टोन - जानकारी के लिए धन्यवाद। मैंने ऐसा मैक्रो बनाने की कोशिश की:

C-x( M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x)

इसने मेरा मैक्रो बनाया, लेकिन जब मैंने अपने मैक्रो को निष्पादित किया तो मुझे वही हाइलाइटिंग नहीं मिला जो मैं सामान्य रूप से प्राप्त करता हूं जब मैं isearch-forward-regexp का उपयोग करता हूं। इसके बजाय यह अभिव्यक्ति के अगले मैच के अंत तक कूद गया। तो यह वास्तव में मुझे जो चाहिए वह काम नहीं करता है। कोई विचार?

संपादित करें: ऐसा लगता है कि मैं जो चाहता हूं उसे करने के लिए मैक्रोज़ का उपयोग कर सकता हूं, मुझे बस isearch-forward-regexp के बॉक्स के बाहर सोचना होगा। मैंने जो सुझाव दिया है, मैं कोशिश करूंगा।

0
ro fr bn

3 उत्तर

आप मैक्रोज़ का उपयोग कर सकते हैं, मैक्रो को समाप्त करने के लिए बस Cx ( फिर मैक्रो के लिए सब कुछ करें, फिर Cx) करें, फिर Cx e निष्पादित करेगा अंतिम परिभाषित मैक्रो। फिर, आप इसे Mx name-last-kbd-macro का उपयोग करके नाम दे सकते हैं, जिससे आप इसे नाम निर्दिष्ट कर सकते हैं, जिसे आप Mx TESTIT के साथ आवेक कर सकते हैं, फिर स्टोर करें Mx insert-kbd-macro का उपयोग करके परिभाषा जो मैक्रो को आपके वर्तमान बफर में रखेगी, और फिर आप इसे अपने .emacs फ़ाइल में संग्रहीत कर सकते हैं।

उदाहरण:

C-x( abc *return* C-x)

"एबीसी" टाइप करने के लिए मैक्रो को परिभाषित करेगा और रिटर्न दबाएगा।

C-xeee

उपरोक्त मैक्रो को तत्काल निष्पादित करता है, 3 बार (पहले ई इसे निष्पादित करता है, फिर 2 ई के बाद इसे दो बार निष्पादित करेगा)।

M-x name-last-kbd-macro testit

"Testit" करने के लिए मैक्रो नाम

M-x testit

सिर्फ नामित मैक्रो निष्पादित करता है (प्रिंट "एबीसी" फिर वापसी)।

M-x insert-kbd-macro

अपने वर्तमान बफर में निम्नलिखित डालता है:

(fset 'testit
   [?a ?b ?c return])

जिसे Emacs को पुनरारंभ करने के बाद नामित मैक्रो का बार-बार उपयोग करने के लिए आपके .emacs फ़ाइल में सहेजा जा सकता है।

0
जोड़ा

@Justin:

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

Emacs मैक्रोज़ के बारे में वास्तव में अच्छी बात यह है कि जब यह घंटी देखता है तो यह रुक जाएगा ... जो तब होता है जब आप एक वृद्धिशील खोज (अन्य चीजों के साथ) से मेल नहीं खाते हैं। तो उपर्युक्त मैक्रो, आप सी-यू 1000 सी-एक्स ई कर सकते हैं जो मैक्रो 1000 बार निष्पादित करेगा ... लेकिन चूंकि आपने एक खोज की है, यह केवल 1000 लाइनों की प्रतिलिपि बनाएगी, या खोज विफलताओं तक! जिसका अर्थ है कि यदि 100 मैचों हैं, तो यह केवल मैक्रो 100 बार निष्पादित करेगा।

संपादित करें: सी-एचएफ हाइलाइट-लाइन-मिलान-रेगेक्सपी देखें जो एक कमांड की मदद दिखाएगा जो रेगेक्स से मेल खाने वाली सभी चीज़ों को हाइलाइट करता है ... मुझे नहीं पता कि हाइलाइटिंग को पूर्ववत कैसे करें ... वैसे भी आप एक का उपयोग कर सकते हैं रेगेक्स से मेल खाने वाले सभी को हाइलाइट करने के लिए संग्रहीत मैक्रो, और फिर अगला मैक्रो ढूंढने के लिए एक और मैक्रो ...?

इसके अलावा संपादित करें: एम-एक्स unhighlight-regexp हाइलाइटिंग को पूर्ववत कर देगा, आपको अंतिम रेगेक्स दर्ज करना होगा (लेकिन यह आपके द्वारा हाइलाइट करने के लिए उपयोग किए गए रेगेक्स पर डिफ़ॉल्ट है)

0
जोड़ा

आम तौर पर, Emacs में कस्टम कीबाइंडिंग को परिभाषित करने के लिए, आप लिखेंगे

(define-key global-map (kbd "C-c C-f") 'function-name)

define-key is, unsurprisingly, the function to define a new key. global-map is the global keymap, as opposed to individual maps for each mode. (kbd "C-c C-f") returns a string representing the key sequence C-c C-f. There are other ways of doing this, including inputting the string directly, but this is usually the most straightforward since it takes the normal written representation. 'function-name is a symbol that's the name of the function.

अब, जब तक कि आपका फ़ंक्शन पहले से परिभाषित नहीं हो जाता है, आप इसका उपयोग करने से पहले इसे परिभाषित करना चाहते हैं। ऐसा करने के लिए, लिखें

(defun function-name (args)
  (interactive)
  stuff
  ...)

defun defines a function - use C-h f defun for more specific information. The (interactive) there isn't really a function call; it tells the compiler that it's okay for the function to be called by the user using M-x function-name and via keybindings.

अब, विशेष रूप से इंटरैक्टिव खोज के लिए, यह मुश्किल है; isearch मॉड्यूल वास्तव में ऐसा करने के लिए प्रतीत नहीं होता है जिसे आप करने का प्रयास कर रहे हैं। लेकिन आप इसे कुछ ऐसा करने के लिए उपयोग कर सकते हैं।

0
जोड़ा