【问题标题】:how can a person add abbreviated names for unicode character names in Emacs一个人如何在 Emacs 中为 unicode 字符名称添加缩写名称
【发布时间】:2016-02-13 12:54:25
【问题描述】:

使用 emacs-24。

有些 unicode 名称很长。根据上下文,某些字符有多个名称。我想添加一些缩写/同义词。怎么样?

这种方法还不错,但是我遇到了较短名称与较长名称别名的问题,而且它是非标准的,即与输入其他名称的方式不一致:

(global-set-key (kbd "C-x g all") "∀")

将字符放在键上的方法在 Emacs 中存在问题,部分原因是键映射已经重载:

(define-key key-translation-map (kbd "C-~") (kbd "¬"))

作为第二个问题,我很好奇为什么这会让 emacs 感到困惑(试一试):

(global-set-key (kbd "C-x g neg") "¬")

我想要的是将缩写与当前的 emacs 方法挂钩,以便按名称输入 unicode 字符。 (我一直在使用 C-x 8 RET 名称 RET - 虽然希望有一种方法可以减少按键次数。)

提前致谢!

【问题讨论】:

    标签: unicode emacs utf-8 elisp


    【解决方案1】:
    1. 您可以轻松定义一个插入给定字符的命令(或者从一些小字符集而不是从整个 Unicode 字符集中进行选择)。

      图书馆ucs-cmds.el 可以提供帮助。当您使用带有负前缀 arg(例如 C--)的 C-x 8 RET 时,它不仅会插入您选择的字符,而且还会创建一个插入字符的命令 - 命令名称与字符名称相同。您可以为整个范围或其他字符集快速创建此类命令(例如,通过匹配正则表达式)。您当然可以将命令重命名为您喜欢的任何名称,包括较短的版本。

      但是您已经知道如何将键绑定到插入给定字符的键盘宏,如您所展示的。如果为此提供一个命名命令有帮助,那么ucs-cmds.el 可以提供帮助。

    2. 您也可以单独执行此操作,例如:

      (defun neg (&optional n)
        "Insert \"¬\".  With prefix arg N, insert N times."
        (interactive "p")
        (dotimes (ii n) (insert "¬")))
      
      (global-set-key (kbd "C-x g neg") 'neg)
      
    3. 但是您显然对插入特定字符的专用命令不是很感兴趣,并且您希望能够使用C-x 8 RET,但在提示您时输入字符名称的缩写,而不是尝试匹配真实的角色名称。

      为此,Icicles 可以提供帮助。当您使用C-x 8 RET 时,您可以匹配字符名称或其代码点(或字符本身 - 当字符易于键入并且您想知道其名称或代码点时很有用)。您可以同时匹配这些的任意组合。

      匹配可以是子字符串、正则表达式、pcompletion 或多种模糊匹配中的任何一种,您可以即时更改匹配行为。所以你可以得到你所要求的缩写的效果,只要你以一种与匹配相对应的方式缩写。

    4. 至于你关于(global-set-key (kbd "C-x g neg") "¬")的问题:我认为这是一个错误。考虑报告它:M-x report-emacs-bug。这是它引发的错误:

      0 kbd 宏迭代后:用户错误:没有 M-x 标记搜索或 M-x 标记查询替换正在进行中

    【讨论】:

    • 我发送了错误报告。我的想法是找到 C-x 8 的绑定位置,然后在运行您提到的实际 reg-x 搜索之前添加一些代码来捕获我的缩写。
    • C-h k C-x 8 RET 告诉你:“Cx 8 RET(翻译自 Cx 8 )运行命令 insert-char(在 global-map 中找到),这是一个交互式内置在C source code 中的函数中。" 但是您可以将C-x 8 RET 绑定到您自己的命令,该命令以交互方式执行您想要的操作,然后根据需要调用insert-char
    【解决方案2】:

    有几种模式可以为数学和逻辑所需的符号提供简化的输入。例如 agda2 模式。 http://wiki.portal.chalmers.se/agda

    【讨论】:

      【解决方案3】:

      操作:

      我想要的是将缩写与当前的 emacs 方法挂钩,以便按名称输入 unicode 字符。 (我一直在使用 C-x 8 RET 名称 RET - 虽然希望有一种方法可以减少按键次数。)

      OP 要求的是: a) 使用带有内置快捷方式“C-x 8 RET”的 emacs 函数“insert-char”,以及 b) 在交互式迷你缓冲区中使用别名来完成“insert-char”输入。

      问题在于“insert-char”的小缓冲区有自己的 TAB 完成。如果要使用 TAB 补全插入希腊小写字母 epsilon (ε),则必须输入最少的击键次数,如下所示:“greek” TAB “sm” TAB “l” TAB “ep”。即使您在 'init.el' 配置文件中有 epsilon 的别名,如下所示:'("eps" "GREEK SMALL LETTER EPSILON")',minibuffer 也不会自动识别它。

      您仍然可以使用第二个函数“expand-abbrev”来使用“init.el”文件中的 epsilon 别名。使用OP中描述的方法,您可以通过使用“Cx 8 RET”(或“Mx insert-char”),输入别名“eps”,然后调用“expand-abbrev”(“Mx expand缩写") 并返回。这将扩展“insert-char”函数的别名。 (“M-x expand-abbrev”还有一个“C-x”快捷键。)

      与 OP 一样,我更喜欢这种方法,而不是(或除此之外)自动别名替换。如果您的配置文件中有这样的内容:

      ;; a quick way to insert unicode characters by code point or name
      (global-set-key [f8] 'insert-char)
      
      ;; call 'expand-abbrev', especially in the 'insert-char' input minibuffer
      (global-set-key [f9] 'expand-abbrev)
      
      ;; abbreviate unicode names
      (define-abbrev-table 'global-abbrev-table '(
          ("ueps" "GREEK SMALL LETTER EPSILON")
          ("Ueps" "ε")
          ("ugsl" "GREEK SMALL LETTER ")
          ("uforall" "FOR ALL")
          ("Uforall" "∀")
          ))
      ;; see .emacs.d/abbrev_defs
      ;; M-x edit-abbrevs
      
      ;; turn on abbrev mode by default
      (setq-default abbrev-mode t)
      

      ,您有两种输入 epsilon 的方法。您可以让 emacs 自动替换别名“Ueps”,也可以使用七次击键“[f8]ueps[f9]RET”。 (其实这里有四种方式。)

      正如 OP 所建议的,为每个特殊字符设置别名(或键绑定)有点不切实际。这就是为什么将 'insert-char' 与 'expand-abbrev' 一起使用是有意义的。例如,如果要插入不太常用的希腊字母,例如 omicron 'ο',则不需要特殊别名;您可以将“ugsl”之类的别名扩展为“GREEK SMALL LETTER”,然后输入“omicron”(或“omi”+TAB)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多