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在较低的水平上使用?
这是应该做你想要的代码:
(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)
我用这里的代码作为起点,你可以在那里寻找参考.