2012-02-02 5 views
7

मैं जो मूल रूप से कहना है कि अपनी स्क्रिप्ट के साथ शुरू कर देना चाहिए http://www.emacswiki.org/emacs/EmacsScripts में दिए गए दिशा-निर्देश, के अनुसार Emacs स्क्रिप्ट लेखन शुरू कर दिया है:Emacs Lisp: क्या समान regexp समूह के समान संख्या के साथ दो अलग-अलग पैटर्न मिलान कर सकता है?

:;exec emacs --script "$0" [email protected] 

अब मैं auto-mode-interpreter-regexp' accordingly, to make Emacs scripts automatically loaded with Emacs-तुतलाना मोड 'को अनुकूलित करना चाहते हैं।

मूल `ऑटो मोड-दुभाषिया-regexp 'मैच के लिए चाहिए था:

#! /bin/bash 
#! /usr/bin/env perl 

और इतने पर, और इस प्रकार यह इस एक था:

"\\(?:#![ ]?\\([^  \n]*/bin/env[ ]\\)?\\([^ \n]+\\)\\)" 

मैं नया जोड़ने की कोशिश की एक विकल्प के रूप regexp:

(setq auto-mode-interpreter-regexp 
    (concat ;; match "#! /bin/bash", "#! /usr/bin/env perl", etc. 
      "\\(?:#![ ]?\\([^  \n]*/bin/env[ ]\\)?\\([^ \n]+\\)\\)" 
      ;; or 
      "\\|" 
      ;; match ":;exec emacs " 
      "\\(?::;[ ]?\\(exec\\)[ ]+\\([^  \n]+\\)[ ]*\\)")) 

लेकिन इस एक, पूरी स्ट्रिंग मिलान करते हुए, अपने submatches पर कब्जा करने में विफल रहा है, esp ईसाई रूप से दूसरा जो दुभाषिया का पता लगाने के लिए आवश्यक है।

(setq auto-mode-interpreter-regexp 
    (concat ;; match "#!" or ":;" 
      "\\(?:#!\\|:;\\)" 
      ;; optional spaces 
      "[ ]?" 
      ;; match "/bin/bash", "/usr/bin/env" or "exec" 
      "\\(\\[^ \n]*/bin/env[ ]\\|exec[ ]\\)?" 
      ;; match interpreter 
      "\\([^ \n]+\\)")) 

मैं बेहतर किया है किया जा सका: इस प्रकार, मैं regexp ही समय में दोनों हेडर मैच के लिए मिश्रित है? धन्यवाद।

उत्तर

1

Emacs में Regexp किसी भी सबमिशन को समूह संख्या असाइन करने के लिए "स्पष्ट रूप से क्रमांकित समूह" निर्माण के उपयोग का समर्थन करता है। Elisp Manual 34.3.1.3 Backslash Constructs in Regular Expressions देखें।

सिंटैक्स ‘(?num: ...)’ है, जहां num चयनित समूह संख्या है।

+0

ओह, हाँ, मैं पूरी तरह से इसके बारे में भूल गया। अच्छा कॉल, हुयायुआन! – Thomas

1

रेगेक्सपी के समूह को उस में दिखाई देने वाले कोष्ठक द्वारा परिभाषित किया गया है। यही कारण है कि आपके तीन रेगेक्सप्स का दूसरा मिलान होता है लेकिन इस मामले में इसका उपयोग नहीं किया जा सकता है: "exec" और "emacs" क्रमशः समूहों 3 और 4 में कैप्चर किए जाते हैं, लेकिन auto-mode-interpreter-regexp स्क्रिप्ट दुभाषिया का नाम समूह 2 में होने की अपेक्षा करता है।

(संपादित करें: क्या मैं ऊपर लिखा है auto-mode-interpreter-regexp के लिए समूह 2 की प्रासंगिकता को छोड़कर गलत है, अंतर्दृष्टि के लिए Huaiyuan के जवाब देखें।।) प्रलेखन के बारे में कहा से

चर:

Regexp मिलान फाइल मोड निर्धारण के लिए दुभाषिया। यह नियमित अभिव्यक्ति को फ़ाइल की पहली पंक्ति के साथ पर 'सेट-ऑटो-मोड' में फ़ाइल का मोड निर्धारित करने के लिए मिलान किया जाता है। यदि यह मेल खाता है, तो फ़ाइल को नियमित अभिव्यक्ति के दूसरे समूह द्वारा मिलान किए गए दुभाषिया द्वारा व्याख्या किया जाता है।

मुझे लगता है कि आपका अंतिम समाधान हालांकि बहुत अच्छा दिखता है। दो टिप्पणियां:

  1. मूल regexp \\(?:...\\) में लपेटा जाता है। इसका प्रति मैच पर कोई प्रभाव नहीं पड़ता है, लेकिन यदि आप इसे अन्य रेगेक्स के साथ संयोजन में उपयोग करते हैं तो यह उन मामलों में सहायक हो सकता है जहां आप पोस्टफिक्स ऑपरेटर जोड़ते हैं:

    (सेटक my-regexp (concat auto-mode-misterter- regexp "?"))

  2. आपका regexp अब #!exec... जैसी सामग्री से मेल खाता है, जो कोई समस्या नहीं हो सकती है। यह उठता है क्योंकि आपने शेबैंग को बाहर निकाला है, (match-string 1) के रूप में करने के लिए सही बात यह है कि शेबैंग समेत (/usr)/bin/env या exec से मिलान करना है।

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