Emacs技术问询:如何为采用关键字界定的类Algol语言Imp配置全局语法着色规则
自动为Imp文件加载Hi-lock语法高亮规则
你完全不需要把Hi-lock的正则规则保存到每个.imp文件里——只需要把这些规则集成到你的my-imp-mode模式定义中,让Emacs在每次打开Imp文件、进入该模式时自动加载它们就好。
具体修改方案
在你的define-derived-mode代码块里,添加初始化逻辑调用hi-lock-add-patterns,把你定义的两个高亮规则传进去。这样模式启动时就会自动应用这些规则,无需依赖文件内的Hi-lock注释。
完整的修改后代码
(defconst my-imp-mode-syntax-table (let ((table (make-syntax-table))) (modify-syntax-entry ?' "\"" table) (modify-syntax-entry ?\" "\"" table) (modify-syntax-entry ?! "<" table) (modify-syntax-entry ?\n ">" table) (modify-syntax-entry ?{ "<" table) (modify-syntax-entry ?} ">" table) (modify-syntax-entry ?\( "()" table) (modify-syntax-entry ?\) ")(" table) table)) (define-derived-mode my-imp-mode prog-mode "Simple Imp Mode" :syntax-table my-imp-mode-syntax-table ;; 自动加载Hi-lock高亮规则 (hi-lock-add-patterns '(("\\%[A-Za-z]*" (0 'imp-keyword prepend)) ("\\<[\\-+]*[0-9]*\\.?[0-9]+\\(\\|@[\\-+]?[0-9]+\\)?\\>" (0 'imp-constant prepend)))) (font-lock-fontify-buffer)) (add-to-list 'auto-mode-alist '("\\.i\\'" . my-imp-mode)) (add-to-list 'auto-mode-alist '("\\.imp\\'" . my-imp-mode)) (global-hi-lock-mode 1) (setq hi-lock-file-patterns-policy (lambda (pattern) t)) (defface imp-keyword '((t (:weight bold :foreground "cyan"))) "Face for IMP keywords" :group 'hi-lock-faces) (defface imp-constant '((t (:foreground "green"))) "Face for IMP numeric constants" :group 'hi-lock-faces)
为什么这样有效?
define-derived-mode的body部分会在每次切换到该模式时执行,所以hi-lock-add-patterns会在打开.imp文件时自动运行,把你的高亮规则应用到当前缓冲区。- 你之前定义的
imp-keyword和imp-constant面(face)已经全局可用,所以Hi-lock能直接引用它们。
测试一下
把你示例Imp文件里的两行! Hi-lock:注释删掉,然后重新打开文件——关键字(如%begin、%integer)会变成粗体青色,数字常量会变成绿色,和之前的效果完全一致。
内容的提问来源于stack exchange,提问作者Graham Toal
相关产品推荐
相关产品推荐

