【问题标题】:How to disable underscore (_) subscripting in Emacs, TeX input method如何在 Emacs、TeX 输入法中禁用下划线 (_) 下标
【发布时间】:2013-03-02 22:28:41
【问题描述】:

在 Emacs 上,我在为自己编辑注释的文本文档(.txt 文档,不是 .tex 文档)时,我正在使用 M-x @987654323 @Ret TeX,以便轻松访问各种 Unicode 字符。例如,键入 \tospace 会导致在文本中插入“→”,并且键入 x^2 会导致插入“x2”,因为我使用的字体支持Unicode 代码点分别为 0x21920x00B2

该方法中特殊处理的字符之一是下划线键_。但是,我用于 Emacs 的字体似乎不支持各种下标字符的代码点,例如下标零(代码点 0x2080),因此当我键入 _0 ,我在输出中得到了一些呈现为薄空白的东西。在这种情况下,我宁愿只使用两个字符 _0

可以通过笨拙的按键序列_空格del0_0 /kbd>,因为在序列中间的 space 击键会导致 Emacs 中止 TeX 输入法。但这很尴尬。

所以,我的问题是:当我在 TeX 输入法中时,如何在本地自定义我的 Emacs 以完全不重新映射 _ 键?或者我怎样才能创建一个修改过的 TeX 输入法克隆(或扩展等),从而从它的魔力中去掉下划线?

到目前为止我尝试过的事情:

  • 我已经在_上完成了M-xdescribe-key;但它只是绑定到self-insert-command,就像许多其他文本字符一样。我确实在那里看到了post-self-insert-hook,但我还没有探索过尝试使用它来颠覆 TeX 输入法。

到目前为止我还没有尝试过的事情:

  • 我没有尝试学习有关输入法架构或其源代码的任何内容。根据我对代码和方法的快速了解。这似乎不是我可以快速跳入的东西。

【问题讨论】:

    标签: emacs input customization


    【解决方案1】:

    所以这是我刚刚找到的解决方案:制作一份 TeX 输入法的个性化副本,删除所有不需要的条目。然后在使用M-x set-input-method时,选择个性化版本,而不是TeX

    我本来会早点尝试的,但是 set-input-mode 及其同类的内置文档并没有为我找到输入方法的实际来源提供足够的指导。只有在对 SO 进行了另一次搜索并找到了这个:Emacs: Can't activate input method 之后,我才能够获得足够的信息来自己完成这项工作。

    详情:

    1. 在 Emacs 中,打开 /usr/share/emacs/22.1/leim/leim-list.el 并找到您要自定义的输入法的条目。该条目将类似于以下形式:

      (register-input-method
       "TeX" "UTF-8" 'quail-use-package
       "\\" "LaTeX-like input method for many characters."
       "quail/latin-ltx")
      
    2. 注意上面表格中最后一个元素中引用的文件名前缀。找到对应的Elisp源文件;在这种情况下,它是文件quail/latin-ltx.el[.gz] 的相对路径。在 Emacs 中打开该文件,然后检查它;它应该包含方法重新映射的条目,包括期望的和不期望的。

    3. 在您的其他 Emacs 自定义项中制作该 Elisp 源文件的用户本地副本。在 Emacs 中打开该本地副本。

    4. 在你的本地副本中,找到文件中的(quail-define-package ...)表格,并更改包名;我用FSK-TeX 作为我的新名字,就像这样:

      (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. 检查您的本地副本,并删除所有不需要的映射的 S 表达式。

    6. 在您的 .emacs 配置文件中,使用类似于您在第 1 步中查看 leim-list.el 时看到的表单注册您的自定义输入法:

      (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. 重新启动 Emacs 并测试您的新输入法;在我的例子中,通过执行M-x set-input-method FSK-TeX,输入a_0,并确认a_0 出现在缓冲区中。


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

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

    所以我会等着看有没有比这更好的答案。

    【讨论】:

    • 您可以使用(quail-defrule "\\sqrt" (decode-char 'ucs #x2713) "TeX") 添加序列。但是我还没有找到一个等效的quail-undefrule 命令来删除它们...
    • 您可以使用(with-temp-buffer (set-input-method "TeX") (quail-map)) 获取映射并对其进行处理,以重构您自己定义输入法的规则。
    • @kdb 谢谢,我会尝试将其调整到我的解决方案中!
    【解决方案2】:

    我自己没有对此进行测试,但这似乎正是您正在寻找的东西:

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

    本博客给出了两种解决方案:

    1. 博文作者:(setq font-lock-maximum-decoration nil)(从最大值)

    2. 作为评论提及:

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

    【讨论】:

    • 嗯,TeX 模式加上font-lock 次要模式与set-input-method TeX 不一样。请特别注意,我正在编辑文本文档(扩展名:.txt),而不是 TeX 文档(扩展名:.tex)。不过,我会查看博客文章,看看是否还有其他可能有帮助的内容。
    • 是的,很抱歉通知您,但事实上,我认为它们中的任何一个在我检查后都不起作用(一个类似的变量已被称为过时)。
    • 你可以试试(global-set-key "_" '(lambda () (interactive) (insert "_"))),我很好奇是不是真正的角色出了问题。 (虽然可能确实如此,因为它绑定到self-inserting-command,我现在打赌会涉及到一些advice
    • 我只是有同样的想法,但它似乎不起作用:在非 TeX 输入法中,自定义函数被调用,但在 TeX 输入法中,不受欢迎的行为发生。我认为这表明我使用describe-key 找出键绑定的实验可能误导了我,因为describe-key 可能只使用 _的键绑定> 来自迷你缓冲区,而不是打开输入法 TeX 的缓冲区中的绑定。
    【解决方案3】:

    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被按下时,我们像以前一样得到,但是

    __ 被按下时,我们得到_

    类似于^

    【讨论】:

      【解决方案4】:

      正如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 hack,但它似乎有效。由于我也对以-^ 开头的快捷方式感到恼火,因此我还使用以下两行来禁用它们:

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

      请注意,之后您可以随时M-x set-input-method 并指示TeXMyTeX 在原始TeX 输入法或自定义输入法之间切换。

      【讨论】:

        猜你喜欢
        • 2010-10-16
        • 1970-01-01
        • 2021-01-27
        • 2016-03-25
        • 2012-02-22
        • 2021-11-03
        • 2017-05-31
        • 2011-02-01
        • 2022-08-08
        相关资源
        最近更新 更多