Tôi đã bắt đầu viết kịch bản Emacs theo hướng dẫn được đưa ra tại http://www.emacswiki.org/emacs/EmacsScripts, mà về cơ bản nói rằng kịch bản của bạn nên bắt đầu với:Emacs Lisp: có thể cùng một regexp khớp với hai mẫu khác nhau với cùng số nhóm không?
:;exec emacs --script "$0" [email protected]
Bây giờ tôi muốn tùy chỉnh auto-mode-interpreter-regexp' accordingly, to make Emacs scripts automatically loaded with
emacs-lisp-mode'.
Bản gốc 'auto-mode-dịch-regexp' có nghĩa là để phù hợp với:
#! /bin/bash
#! /usr/bin/env perl
và như vậy, và do đó nó là một điều này:
"\\(?:#![ ]?\\([^ \n]*/bin/env[ ]\\)?\\([^ \n]+\\)\\)"
tôi đã cố gắng thêm mới regexp là một giải pháp thay thế:
(setq auto-mode-interpreter-regexp
(concat ;; match "#! /bin/bash", "#! /usr/bin/env perl", etc.
"\\(?:#![ ]?\\([^ \n]*/bin/env[ ]\\)?\\([^ \n]+\\)\\)"
;; or
"\\|"
;; match ":;exec emacs "
"\\(?::;[ ]?\\(exec\\)[ ]+\\([^ \n]+\\)[ ]*\\)"))
nhưng điều này, trong khi khớp với toàn bộ chuỗi, không nắm bắt được các bản con, ecially thứ hai là cần thiết để phát hiện các thông dịch viên. Do đó, tôi đã trộn lẫn regexp để đối sánh cả hai tiêu đề cùng một lúc:
(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]+\\)"))
Tôi có thể làm tốt hơn không? Cảm ơn bạn.
Ồ, vâng, tôi hoàn toàn quên mất điều đó. Tốt, huaiyuan! – Thomas