如何让Emacs显示与实际存储的不同的字符?

问题描述 投票:0回答:2

我想为Emacs实现动态文本替换(仅替换显示,不替换实际存储的文件),使用Elisp。

例如,在 LaTeX 文档中,我想输入

\alpha
,然后让 Emacs 将其显示为
α
,这样更容易阅读。但在结果
.tex
文件中,我仍然想要保存
\alpha
,而不是
α
。 (注:我自己可以使用XeTeX或LuaTeX来直接支持UTF-8。但是出于协作和期刊要求的原因,我不希望UTF-8字符直接保存在
.tex
文件中。或者我可以在 AUCTeX 中使用预览。但这在我编辑公式时没有帮助)

现有的示例是在组织模式下,当我们键入

[[link][name]]
时,在键入最后一个
]
后,显示的文本将仅替换为带有超链接的名称。另一方面,保存此文件时,保存的内容是原来的
[[link][name]]
,与显示的不同。

有什么想法可以如何实现吗?

PS:Emacs 手册中的取代文本的显示规格部分已关闭。但是,我需要指定起点和终点,而不是指定替换所需的字符串。这意味着我需要在每次用户输入后进行搜索以确定起点和终点。由于算法的性能和复杂性,这看起来不现实。

emacs elisp
2个回答
6
投票

实现此目的的一种方法是为相关模式添加字体锁定关键字,并使用

compose-region
显示新字形来代替旧字符串:

(font-lock-add-keywords
 'latex-mode `(("\\(\\\\alpha\\)"
                (0 (progn (compose-region (match-beginning 1)
                                          (match-end 1) "α")
                          nil)))))

还请注意,

org-mode
已经内置了这种功能,不仅适用于您提到的链接,还适用于类似 LaTeX 的实体:

(setq org-pretty-entities t)

0
投票

@FrançoisFévotte 的答案非常接近,只是

compose-region
不是适合该任务的函数。此函数将“显示字符串”折叠为单个字符,这可能不是您想要的。 IOW,如果您决定传递
"α"
而不是传递
"ααα"
,您仍然会得到一个
α
字符作为结果。

相反,您需要一个

put-text-property
函数。例如:

(font-lock-add-keywords
 'latex-mode `(("\\(\\\\alpha\\)"
                (0 (progn (put-text-property (match-beginning 1) (match-end 1)
                                             'display "α")
                           nil)))))
© www.soinside.com 2019 - 2024. All rights reserved.