如何在Emacs中禁用下划线(_)作为上标符号,TeX输入法

13
在Emacs编辑我的备忘录文本文档(一个.txt文件,不是 .tex文件)时,我使用M-x set-input-method Ret TeX,以便轻松访问各种Unicode字符。例如,键入\tospace会在文本中插入一个“→”,而键入x^2会使插入“x2”,因为我使用的字体支持Unicode代码点0x21920x00B2
在该方法中,特殊处理字符之一是下划线键_。然而,我在Emacs中使用的字体似乎不支持各种下标字符(例如下标零(代码点0x2080)的代码点),因此当我键入_0时,输出结果呈现为一个细小的空白。在这种情况下,我希望只有两个字符_0
通过尴尬的按键序列_spacedel0,我可以获得_0,因为序列中间的space按键使Emacs中止了TeX输入法。但这很麻烦。
因此,我的问题是:当我处于TeX输入法时,如何本地自定义我的Emacs,完全不重新映射_键?或者我如何创建一个修改后的克隆(或扩展等)TeX输入法,从其神奇的符号中去掉下划线?
我迄今尝试过的事情:
  • 我已经在_上执行了M-xdescribe-key; 但它只是绑定到self-insert-command,就像许多其他文本字符一样。 我确实看到了一个post-self-insert-hook,但我没有尝试使用它来破坏TeX输入法。

到目前为止,我还没有尝试过以下事情:

  • 我还没有尝试学习有关输入法架构或其源代码的任何内容。 从我对代码和方法的快速审视中,似乎不是我可以快速掌握的东西。
4个回答

6
所以这是我刚刚找到的解决方案:制作一个个性化的 TeX 输入法副本,删除所有不需要的条目。然后在使用时,选择个性化版本而不是TeX
我本来会早点尝试这样做的,但是set-input-mode及其类似项内置的文档没有提供足够的指导,让我找不到输入法的实际来源。只有在在SO上进行另一次搜索并找到这个:Emacs: Can't activate input method之后,我才能得到足够的信息自行处理。
细节:
  1. In Emacs, open /usr/share/emacs/22.1/leim/leim-list.el and find the entry for the input method you want to customize. The entry will be something like the following form:

    (register-input-method
     "TeX" "UTF-8" 'quail-use-package
     "\\" "LaTeX-like input method for many characters."
     "quail/latin-ltx")
    
  2. Note the file name prefix referenced in the last element in the form above. Find the corresponding Elisp source file; in this case, it is a relative path to the file quail/latin-ltx.el[.gz]. Open that file in Emacs, and check it out; it should have the entries for the method remappings, both desired and undesired.

  3. Make a user-local copy of that Elisp source file amongst your other Emacs customizations. Open that local copy in Emacs.

  4. In your local copy, find the (quail-define-package ...) form in the file, and change the name of the package; I used FSK-TeX as my new name, like so:

    (quail-define-package
     "FSK-TeX" "UTF-8" "\\" t   ;; <-- The first argument here is the important bit to change.
     "LaTeX-like input method for many characters but not as many as you might think.
     ...)
    
  5. Go through your local copy, and delete all the S-expressions for mappings that you don't want.

  6. In your .emacs configuration file, register your customized input method, using a form analogous to the one you saw when you looked at leim-list.el in step 1:

    (register-input-method
     "FSK-TeX" "UTF-8" 'quail-use-package
     "\\" "FSK-customized LaTeX-like input method for many characters."
     "~/ConfigFiles/Elisp/leim/latin-ltx")
    
  7. Restart Emacs and test your new input-method; in my case, by doing M-x set-input-method FSK-TeX, typing a_0, and confirming that a_0 shows up in the buffer.


因此,一旦安装了至少一个答案,比问题中列出的一些解决方法更不尴尬(事实证明,它们也在 Emacs 22 手册中正式记录为一种切断输入法处理的方法)。

然而,我并不真的满意这个解决方案,因为我更希望继承 TeX 模式的未来更改,只是让我的.emacs在启动时删除不需要的条目。

因此,我将等待看是否有人提出比这更好的答案。


1
您可以使用(quail-defrule "\\sqrt" (decode-char 'ucs #x2713) "TeX")添加序列。但我尚未找到相应的quail-undefrule命令来删除它们... - Jim Paris
2
你可以使用(with-temp-buffer (set-input-method "TeX") (quail-map))来获取映射并处理它,以重构定义自己输入法的规则。 - kdb
@kdb 谢谢,我会尝试将其融入我的解决方案中! - pnkfelix

1

evil插件是一种类似vim模态按键绑定的工具,它允许将连续按两次_键映射为插入单个_字符:

(set-input-method 'TeX)
(define-key evil-insert-state-local-map (kbd "_ _")
  (lambda () (interactive) (insert "_")))
(define-key evil-insert-state-local-map (kbd "^ ^")
  (lambda () (interactive) (insert "^")))

当按下_再按下1时,我们像之前一样得到,但是当按下_再按下_时,我们得到_。对于^也是类似的。

1

我自己没有测试过,但这似乎是你要找的确切方法:

"如何在emacs中禁用TeX模式下的下划线下标" - source

此博客文章提供了两种解决方案:

  1. 作者提供的方法:(setq font-lock-maximum-decoration nil)(从maximum)

  2. 作为评论提到的方法:

    (eval-after-load "tex-mode" '(fset 'tex-font-lock-subscript 'ignore))


嗯,TeX模式加上font-lock小模式并不等同于set-input-method TeX。特别注意,我正在编辑一个文本文档(扩展名:.txt),而不是TeX文档(扩展名:.tex)。我会查看博客文章,看看是否有其他可以帮助我的内容。 - pnkfelix
是的,很抱歉告诉你,我检查过后确实不认为它们中的任何一个现在可用(一个类似的变量已被称为过时)。 - PascalVKooten
1
你能否尝试一下(global-set-key "_" '(lambda () (interactive) (insert "_"))),我很好奇这是否是实际字符出了问题。(虽然可能确实有问题,因为它被绑定到self-inserting-command,但我现在打赌是某些“advice”引起的问题) - PascalVKooten
1
我刚有了同样的想法,但似乎不起作用:在非 TeX 输入法中,自定义函数被调用,但在 TeX 输入法中,会出现不良行为。我认为这表明我使用 describe-key 查找键绑定的实验可能误导了我,因为它可能只是从迷你缓冲区中使用 <kbd>_</kbd> 的键绑定,而不是打开 TeX 输入法的缓冲区的绑定。 - pnkfelix

0
pnkfelix answer所解释的那样,似乎我们必须制作一个个性化的TeX输入法副本。但是这里有一种更轻松的方法,无需进行任何文件调整。只需将以下内容放入您的.emacs中即可:
(eval-after-load "quail/latin-ltx"
  '(let ((pkg (copy-tree (quail-package "TeX"))))
     (setcar pkg "MyTeX")
     (assq-delete-all ?_ (nth 2 pkg))
     (quail-add-package pkg)))
(set-input-method 'TeX)
(register-input-method "MyTeX" "UTF-8" 'quail-use-package "\\")
(set-input-method 'MyTeX)

重要的部分是中间的assq-delete-all行,它删除所有以_开头的快捷方式条目。这有点像Lisp的黑客,但似乎很有效。由于我也对以-^开头的快捷方式感到烦恼,我还使用以下两行来禁用它们:

     (assq-delete-all ?- (nth 2 pkg))
     (assq-delete-all ?^ (nth 2 pkg))

请注意,之后您可以随时使用M-x set-input-method命令,并指定TeXMyTeX来在原始的TeX输入法和自定义输入法之间进行切换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接