2012-02-02 3 views
7

나는 기본적으로 스크립트로 시작해야한다는 말을 http://www.emacswiki.org/emacs/EmacsScripts에 주어진 지시에 따라 이맥스 스크립트를 쓰기 시작했습니다Emacs Lisp : 동일한 regexp가 동일한 수의 그룹으로 두 개의 다른 패턴을 일치시킬 수 있습니까?

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

가 지금은 auto-mode-interpreter-regexp' accordingly, to make Emacs scripts automatically loaded with 이맥스 LISP 모드 '를 정의하고 싶습니다.

원래`자동 모드 통역 정규 표현식 '

이 일치하도록 의미되었다 : 등등

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

과, 따라서 그것은이 하나 :

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

나는 새를 추가하는 시도 대안으로 정규 표현식 : 전체 문자열을 맞추어

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

그러나 이것은, ESP, 그 submatches을 포착하는 데 실패 그 중 두 번째는 통역사를 탐지하는 데 필요합니다. 따라서 두 헤더를 동시에 일치 시키려면 정규 표현식을 혼합했습니다.

(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]+\\)")) 

더 잘 수행 했습니까? 고맙습니다.

답변

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의 답변을 참조하십시오.).

을 상기 문서에서 변수를

정규 표현식 매칭 파일 모드 결정을위한 해석기. 이 정규 표현식은 파일의 첫 번째 행과 일치하여 의`set-auto-mode '에서 파일의 모드를 결정합니다. 일치하는 경우 파일 은 두 번째 정규 표현식 그룹과 일치하는 인터프리터에 의해 해석되는 것으로 가정합니다.

최종 해결책은 꽤 좋아 보입니다. 두 코멘트 :

  1. 원래 정규 표현식은 \\(?:...\\)에 싸여있다. 이것은 그 자체로는 영향을 미치지 않지만 다른 정규 표현식과 함께 사용하면 후위 연산자를 추가 할 때 도움이 될 수 있습니다 :

    (setq my-regexp (concat auto-mode-interpreter- regexp "?"))

  2. 정규 표현식은 이제 #!exec...과 같은 항목과 일치하므로 문제가되지 않을 수 있습니다. 이는 shebang을 제외하고 각각 (match-string 1)(/usr)/bin/env 또는 exec과 일치하도록해야하는 옳은 일이라고 생각한 이유 때문입니다.

관련 문제