Emacs-lisp:LaTeX的美化符号模式

kdb*_*kdb 5 emacs latex elisp font-lock

我试图将"漂亮的实体"行为移植org-mode到latex-mode使用内置的Emacs prettify-symbols-mode.此模式用于font-lock-mode将缓冲区中的字符序列显示为单个(unicode)字符.默认情况下,例如emacs-lisp代码

(lambda () t)
Run Code Online (Sandbox Code Playgroud)

变

(? () t)
Run Code Online (Sandbox Code Playgroud)

然而,它似乎要求字符序列由一些字符分隔,例如白色空格.例如在我的设置中,替换

\alpha \beta -> ? ?`
Run Code Online (Sandbox Code Playgroud)

会工作,但是当字符串没有分开时它会失败,例如

\alpha\beta -> \alpha?
Run Code Online (Sandbox Code Playgroud)

这是一个特别的问题,因为我想使用这种美化来使量子力学方程更具可读性,例如我更换的

|\psi\rangle -> |??
Run Code Online (Sandbox Code Playgroud)

是否可以避免使用此分隔符问题prettify-symbols-mode?如果不是,是否可以font-lock-mode在较低的水平上使用?

abo*_*abo 6

这是应该做你想要的代码:

(defvar pretty-alist
  (cl-pairlis '("alpha" "beta" "gamma" "delta" "epsilon" "zeta" "eta"
                "theta" "iota" "kappa" "lambda" "mu" "nu" "xi"
                "omicron" "pi" "rho" "sigma_final" "sigma" "tau"
                "upsilon" "phi" "chi" "psi" "omega")
              (mapcar
               (lambda (x) (make-char 'greek-iso8859-7 x))
               (number-sequence 97 121))))
(add-to-list 'pretty-alist '("rangle" . ?\?))
(defun pretty-things ()
  (mapc
   (lambda (x)
     (let ((word (car x))
           (char (cdr x)))
       (font-lock-add-keywords
        nil
        `((,(concat "\\(^\\|[^a-zA-Z0-9]\\)\\(" word "\\)[a-zA-Z]")
            (0 (progn
                 (decompose-region (match-beginning 2) (match-end 2))
                 nil)))))
       (font-lock-add-keywords
        nil
        `((,(concat "\\(^\\|[^a-zA-Z0-9]\\)\\(" word "\\)[^a-zA-Z]")
            (0 (progn
                 (compose-region (1- (match-beginning 2)) (match-end 2)
                  ,char)
                 nil)))))))
   pretty-alist))
Run Code Online (Sandbox Code Playgroud)

如上所示,pretty-alist从希腊字符开始.然后我添加 \rangle只是为了演示如何添加新的东西.要自动启用它,请将其添加到钩子:

(add-hook 'LaTeX-mode-hook 'pretty-things)
Run Code Online (Sandbox Code Playgroud)

我用这里的代码作为起点,你可以在那里寻找参考.