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

如何在Emacs的Algol模式中实现输入时实时文本替换?

为Algol 60 Unicode源文件实现自动字符替换的Emacs模式

我正在为编辑采用Unicode字符编写的Algol源文件创建主模式,目前已完成基础配置:

(add-to-list 'auto-mode-alist '("\\.a60\\'" . algol-mode))

核心需求

  • 编辑.a60文件时,输入特定连续字符序列(如<=),自动删除该序列并插入对应的Unicode字符(如≤)
  • 非连续输入的相同字符序列不触发替换,仅对新输入的文本生效
  • 替换后的Unicode字符需直接写入文件,而非仅在编辑器中显示替换效果
  • 希望实现通用的输入文本过滤机制,能在.emacs中定义多组「输入文本-替换文本」映射(类似(substitute "&&" "∧")的形式),且无需输入转义字符

实现方案

尝试过global-set-key、abbrev-mode等方案,均未达到预期效果。最终采用以下代码实现需求,仅需微调部分替换规则即可:

(add-to-list 'auto-mode-alist '("\\.a60\\'" . a60-mode))

(defun a60-chars () "Convert Algol 60 symbols from ISO to Unicode."
  (interactive)
  (if (looking-back "<=") (progn (backward-delete-char 2) (insert "≤") )
  (if (looking-back ">=") (progn (backward-delete-char 2) (insert "≥") )
  ;; (if (looking-back "\\\\")  (progn (backward-delete-char 1) (insert "¬") )
  (if (looking-back "~")  (progn (backward-delete-char 1) (insert "¬") )
  (if (looking-back "&&") (progn (backward-delete-char 2) (insert "∧") )
  (if (looking-back "||") (progn (backward-delete-char 2) (insert "∨") )
  (if (looking-back "!=") (progn (backward-delete-char 2) (insert "≠") )
  (if (looking-back "==") (progn (backward-delete-char 2) (insert "≡") )
  (if (looking-back "*")  (progn (backward-delete-char 1) (insert "×") )
  ;; (if (looking-back "\\^")  (progn (backward-delete-char 1) (insert "↑") )
  (if (looking-back "<>") (progn (backward-delete-char 2) (insert "≠") )
  (if (looking-back "//") (progn (backward-delete-char 2) (insert "÷") )
)))))))))))

;; Only enable when editing .a60 files:
(add-hook 'a60-mode-hook
          '(lambda()
            (add-hook 'post-self-insert-hook #'a60-chars nil 'local)
            )
          t
)

内容的提问来源于stack exchange,提问作者Graham Toal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:05:39