5

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

(lambda () t)

变成

(λ () t)

然而,它似乎需要用一些字符(例如空格)分隔字符序列。例如在我的设置中,替换

\alpha \beta -> α β`

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

\alpha\beta -> \alphaβ

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

|\psi\rangle -> |ψ⟩

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

4

2 回答 2

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))

正如您在上面看到的,pretty-alist从希腊字符开始。然后我添加 \rangle只是为了演示如何添加新事物。要自动启用它,请将其添加到钩子中:

(add-hook 'LaTeX-mode-hook 'pretty-things)

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

于 2014-04-08T13:20:47.937 回答
2

prettify-symbols-mode 的代码源自为 Haskell 和其他一些语言开发的代码,它们不使用 TeX 之类的东西\。所以你可能确实遇到了麻烦。我建议您M-x report-emacs-bug请求改进 prettify-symbol-mode 以支持 TeX 样式的语法。

同时,您必须按照 abo-abo 的建议“手工完成”。

请注意:在 Emacs-21 时代,我将 X-Symbol 移植到 Emacs 上,特别是因为我想在 LaTeX 中看到如此漂亮的东西。然而,我发现它对我几乎没有用。我认为现在情​​况更是如此。原因如下:

  • 您可以ψ在 LaTeX 代码中使用实际字符,而不是\psi现在。所以你不需要显示技巧让它看起来“正确”。
  • 而不是重复|\psi\rangle我更喜欢定义宏然后使用\Qr{\Vangle}(其中 \Vangle 变成 \psi(“V”代表“metaVariable”),并且 \Qr 将它包裹在一个小括号中)所以我可以轻松地调整这些宏并知道文件将保持一致。此时,\psi 和 \rangle 的漂亮显示并不重要。
于 2014-04-08T13:51:20.250 回答