I want to implement dynamical text replacement (only the display is replaced, the actual stored file is not replaced) for Emacs, using Elisp.
For example, in LaTeX documents, I want to type \alpha
, and let Emacs display it just as α
, so it is easier to read. But in the result .tex
file, I still want \alpha
, instead of α
to be saved. (Remark: I could use XeTeX or LuaTeX myself to support UTF-8 directly. But for the reason of collaboration and journal requirements, I don't want the UTF-8 characters to be directly saved in the .tex
files. Alternatively I could use preview in AUCTeX. But that doesn't help when I am editing the formula)
An existing example is in org-mode, when we type [[link][name]]
, right after typing the last ]
, the displayed text is replaced by just the name, with hyperlink. On the other hand, when saving this file, the saved content is the original [[link][name]]
, different from the displayed one.
Any ideas how this could be implemented?
PS: The Display Specs That Replace The Text section of Emacs manual goes close. However, I need to specify the start and end points, instead of the desired string for the replacements. This means I need to do search after every user input to decide the start and end points. This looks unrealistic due to performance and complexity of algorithm.
One way to do this is to add font lock keywords for the relevant modes, and to use compose-region
to display the new glyph in place of the old string:
(font-lock-add-keywords
'latex-mode `(("\\(\\\\alpha\\)"
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "α")
nil)))))
Please also note that org-mode
has a feature of this kind already built-in, not only for links as you mentioned, but also for LaTeX-like entities:
(setq org-pretty-entities t)