如何在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
相关产品推荐
相关产品推荐

