我是 Oleg Alexandrov 的狂热粉丝方法用于自定义 XEmacs,使其成为一个高效的 LaTeX 文件编辑系统。我发现一个特别有用的功能是让 XEmacs 自动扩展缩写。(您可能会问:为什么不直接使用宏?答案:例如,我喜欢这种功能,只需键入\eq
,按下空格键后,我的光标就会被放置在语法正确的方程环境中。)
XEmacs 的一个怪癖似乎是不能在缩写中使用大写字母。例如,假设将定义\s
为缩写,并将其扩展为\mathsf{
(在数学模式下使用无衬线字体)。然后输入\S
将扩展为\Mathsf
,这将无法编译。如果还想使用\S
LaTeX 中的普通命令来排版“部分”符号,则此行为是不可取的。一种解决方法是将或类似的东西定义\sec
为要扩展为的“缩写” \S
,但这有点烦人。
(另一个例子:如果出于某种原因,想要避免使用宏,则可以使用缩写来实现相同的功能。但由于同样的大写问题,不能定义\gl
be$\mathfrak{gl}$
和\GL
be ;我相信后者将扩展为 。)\mathrm{GL}
\Mathfrak{gl}
我的问题是:有没有更令人满意的解决这个问题的方法?
PS 如果这个问题更适合 stackoverflow 或其他 stackexchange 网站,请告诉我。
答案1
以下只是一个粗略的临时解决方案的建议,因为我已经很久没有编写过 elisp 了,所以实现它需要很长时间,但它还是值得的:emacs 和 xemacs 有一个名为的钩子,pre-abbrev-expand-hook
它是缩写扩展完成之前要调用的函数列表。您可以使用该钩子将任何包含大写字母的缩写转换为使用全小写字母的其他缩写,并将其扩展为您想要的内容。
例如,您可以选择一个永远不会出现在任何缩写中的字符串,例如,xxx
并编写一个函数,查看 point 之前的单词,并将每个大写字母替换为前面带有 的小写字母xxx
。也就是说,如果您输入,GL
它将被替换为xxxgxxxl
。然后,您可以将该函数添加到并定义一个缩写,用您想要扩展的任何内容pre-abbrev-expand-hook
替换。xxxgxxxl
GL
答案2
我认为您要找的是 选项:case-fixed
。define-abbrev
特别是您将无法使用define-mode-abbrev
。