emacs
  • haskell
  • elisp
  • alignment
  • 2011-01-11 14 views 13 likes 
    13

    मैं हास्केल में काम कर रहा हूँ और अक्सर निम्न के समान कोड के पार चलो elisp पता नहीं है। मैंने उद्धरण के बिना बस "=" करने की कोशिश की है, लेकिन यह प्रत्येक '=' से पहले एक अवांछित अंतरिक्ष चरित्र डालता है। मुझे एक प्रस्तावित समाधान here मिला है लेकिन मुझे ऐसा कुछ नहीं लगता है।Emacs = पर संरेखित-regexp नहीं बल्कि ==

    कृपया मुझे एक फ़ंक्शन या हार्ड-कोडेड मैक्रो लिखने में सहायता करें जो मुझे इसके लिए एक कीबाइंडिंग सेट करने की अनुमति देगी।

    उत्तर

    17

    Cu एमएक्सalign-regexpआरईटी\(\s-*\) =आरईटी1आरईटी0आरईटीn

    (वहाँ के बाद '=' एक अंतरिक्ष है नायब, लेकिन यह बहुत स्पष्ट नहीं है।)

    जो कहना है ...

    डिफ़ॉल्ट रूप से इसे अधिक पैरामीटर के लिए पूछने के लिए align-regexp बताने के लिए एक उपसर्ग तर्क का उपयोग करें।

    देखें सी एच एफalign-regexp और सी एच वी जानकारी के लिए align-rules-list, लेकिन संक्षेप में:

    \(\s-*\) विलोपन/विस्तार के लिए डिफ़ॉल्ट 'समूह' है। हम अपने पैटर्न को इसके अंत में जोड़ते हैं: '='। (ध्यान दें कि \s- व्हाइटस्पेस के लिए Emacs regexp वाक्यविन्यास है।)

    1 बस ब्रांडेड समूह 1 (ऊपर के रूप में) को संदर्भित करता है। यह डिफ़ॉल्ट है।

    0 लाइन के दो हिस्सों के बीच उपयोग करने के लिए दूरी के लिए। डिफ़ॉल्ट रूप से यह 1 है, और यही कारण है कि आप एक अतिरिक्त स्थान के साथ समाप्त हो रहे थे।

    n प्रत्येक पंक्ति में पहले के बाद किसी भी पैटर्न पैटर्न को संरेखित करने के लिए नहीं।

    संपादित करें: असल में, क्यू & एक आप समान के पास है से जुड़ा हुआ है, और Emacs 23.2.1 पर मेरे लिए ठीक काम करता है, तो यह डुप्लिकेट है, लेकिन जारी रखने के लिए और महत्वपूर्ण बाध्यकारी पहलू जवाब देने के लिए:

    आप कुंजीपटल मैक्रोज़ के माध्यम से उस (या किसी भी) अनुक्रम को बांध सकते हैं। यहां अंतिम परिणाम दिया गया है, जिसे आप शायद अपनी init फ़ाइल में जोड़ सकते हैं, हालांकि मैं आपको प्रक्रिया के माध्यम से जाने की सलाह देता हूं। कुंजी के लिए C-c a के स्थान पर जो कुछ भी आपको पसंद है उसका उपयोग करें। C-c (letter) और F5-F9 अंतिम उपयोगकर्ताओं के लिए बाध्य होने के लिए आरक्षित हैं, इसलिए उनमें से एक मोड के कीमैप द्वारा क्लॉब्बेड होने से सुरक्षित होगा।

    1. पाठ का चयन:

      (global-set-key (kbd "C-c a") (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([21 134217848 97 108 105 103 110 45 114 101 103 101 120 112 return 32 61 32 return return backspace 48 return 110] 0 "%d")) arg))) 
      

      मुझे लगता है कि द्वारा किया।रिकॉर्डिंग शुरू करने के लिए

    2. F3
    3. उपरोक्त के रूप में align-regexp प्रदर्शन (सबकुछ वर्बैटिम टाइप करने के लिए सावधान रहना, और मिनीबफर इतिहास या यांकिंग का उपयोग नहीं करना)।
    4. एफ 4 रिकॉर्डिंग को रोकने के लिए।
    5. सी एक्स सी-कश्मीर एनalign-single-equalsआरईटी मैक्रो एक नाम
    6. एम एक्सinsert-kbd-macroआरईटीalign-single-equalsआरईटी तुतलाना पाने के लिए देने के लिए।
    7. (lambda) अभिव्यक्ति को (global-set-key) के साथ अभिव्यक्त करने के लिए इसे लपेटना। (यद्यपि आप भी (fset 'align-single-equals ...) कोड के रूप में प्रदान इस्तेमाल कर सकते हैं, और फिर उस प्रतीक के लिए महत्वपूर्ण बाँध।

    जब एक जटिल मैक्रो रिकॉर्डिंग आप एक गलती करते हैं, तो चिंता नहीं है — Emacs एक बहुत प्रदान करता है अच्छा मैक्रो संपादक जो आप के बाद आप रिकॉर्डिंग करना समाप्त किसी भी गलतियों को ठीक करने के लिए उपयोग कर सकते हैं (बस टाइप Cx सी.के. ई) है, तो आप सही हो की जरूरत नहीं है

    संपादित 2:। के रूप में अच्छी तरह से एक का एक उदाहरण जोड़ने मई टिप्पणियों के अनुसार, कार्य।

    (defun my-align-single-equals() 
        "Align on a single equals sign (with a space either side)." 
        (interactive) 
        (align-regexp 
        (region-beginning) (region-end) 
        "\\(\\s-*\\) = " 1 0 nil)) 
    
    (global-set-key (kbd "C-c a") 'my-align-single-equals) 
    
    +0

    धन्यवाद। मैं आपके समाधान का उपयोग करने में सक्षम था लेकिन मैक्रो के बजाए एक फ़ंक्शन बनाया, क्योंकि यह मेरे लिए अधिक पठनीय है। – Karl

    +0

    वैसे यह भी बेहतर है :) यदि आप लिस्पी लिखने में खुश हैं तो एक फ़ंक्शन निश्चित रूप से बेहतर होता है, लेकिन यदि आप नहीं हैं तो मैक्रोज़ बहुत आसान हैं। – phils

    +0

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

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