Emacs仅显示的缩写

dav*_*dsd 2 emacs

我在emacs中编辑Mathematica代码.Mathematica的希腊字母的明文表示看起来像

\[Alpha], \[Beta], \[Gamma], ...
Run Code Online (Sandbox Code Playgroud)

我不介意输入这些,但结果代码很大,看起来很笨重,例如:

k[\[Beta]_,z_]:=z^(\[Beta]/2) Hypergeometric2F1[\[Beta]/2,\[Beta]/2,\[Beta],z];
Run Code Online (Sandbox Code Playgroud)

有没有办法使emacs自动显示某些字符串(如\[Alpha])作为其他字符串(如alpha的unicode字符)?注意,我不想实际用另一个字符串替换一个字符串(如果我理解的话,这是缩写的缩写),因为Mathematica仍然可以正确读取该文件.

imm*_*rrr 5

是的,有办法.Plain Emacs解决方案是使用compose-region完全相同的功能.此代码段将定义一个函数compose-greek-symbols,如果font-lock处于活动状态,它将在当前缓冲区中激活请求的缩写替换:

(setq
 greek-symbols
 (loop
  ;; characters are entered with `ucs-insert'
  ;; '?' is "GREEK SMALL LETTER ALPHA"
  for ch from ?? to ??
  collect (let ((str (get-char-code-property ch 'name)))
        (setq str
          (upcase-initials
           (downcase
            (replace-regexp-in-string "greek small letter " "" str))))
        (cons str ch))))


(defun compose-greek-symbols ()
  (interactive)
  (font-lock-add-keywords
   nil
   '(("\\\\\\[\\([^]]+\\)\\]"
      (0 (progn (let
            ((sym (cdr-safe (assoc (match-string 1) greek-symbols))))
          (when sym
            (compose-region (match-beginning 0)
                    (match-end 0)
                    sym)))))))))
Run Code Online (Sandbox Code Playgroud)

EmacsWiki提供了更多解决方案.如果你愿意安装新的软件包,你可以尝试更复杂的东西,比如漂亮的符号模式.