Ho iniziato a scrivere sceneggiature di Emacs in base alle indicazioni fornite in http://www.emacswiki.org/emacs/EmacsScripts, che sostanzialmente dicono che gli script devono iniziare con:Emacs Lisp: la stessa espressione regolare può corrispondere a due modelli diversi con lo stesso numero di raggruppamenti?
:;exec emacs --script "$0" [email protected]
Ora mi piacerebbe personalizzare auto-mode-interpreter-regexp' accordingly, to make Emacs scripts automatically loaded with
emacs-lisp-mode'.
L'originale `auto-mode-interprete-regexp' stato destinato per abbinare:
#! /bin/bash
#! /usr/bin/env perl
e così via, e quindi era questo:
"\\(?:#![ ]?\\([^ \n]*/bin/env[ ]\\)?\\([^ \n]+\\)\\)"
Ho provato ad aggiungere la nuova regexp come alternativa:
(setq auto-mode-interpreter-regexp
(concat ;; match "#! /bin/bash", "#! /usr/bin/env perl", etc.
"\\(?:#![ ]?\\([^ \n]*/bin/env[ ]\\)?\\([^ \n]+\\)\\)"
;; or
"\\|"
;; match ":;exec emacs "
"\\(?::;[ ]?\\(exec\\)[ ]+\\([^ \n]+\\)[ ]*\\)"))
ma questo, mentre si abbina l'intera stringa, non è riuscito a catturare le sue submatches, esp ecialmente il secondo che è necessario per rilevare l'interprete. Così, ho mescolato l'espressione regolare per abbinare sia le intestazioni allo stesso tempo:
(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]+\\)"))
avrei potuto fare meglio? Grazie.
Oh, sì, me ne sono completamente dimenticato. Buona chiamata, huaiyuan! – Thomas