You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:47:42