【问题标题】:how to set completion when define my own function定义我自己的函数时如何设置完成
【发布时间】:2013-07-28 03:48:20
【问题描述】:

我写了一个在"EMACS"中插入一些特殊字符的函数,它会要求输入名称并插入相应的特殊字符。

示例:当我输入“alpha”时,函数将插入α

但是当我输入这些字符时,我发现我不能使用自动完成。我将 alpha 定义为 α,将 beta 定义为 β,但是当我输入 al[Tab] 时,它只会插入一个制表符。

如何为我的函数定义自动完成功能?

--编辑--------------------------------

对不起,我还是emacs新手,昨天才开始写elisp函数。

我只是用一种直接的方式来实现这个功能,使用interactive和代码s来读取字符串

这就是为什么我想知道如何完成自动完成。因为我没有找到任何关于这些事情的教程。也许是因为我缺乏 elisp 知识来寻找正确的答案。

无论如何,这是我的代码:

(defun sp-char (char)
"Insert some special chars."
(interactive "sInput char name: ")
(let ((funky-char))
    (setq funky-char
      (cond
       ((string= char "Alpha" ) "Α")
       ((string= char "alpha" ) "α")
       ((string= char "Beta" ) "Β")
       ((string= char "beta" ) "β")
       ((string= char "Gamma" ) "Γ")
       ((string= char "gamma" ) "γ")
       ((string= char "Delta" ) "Δ")
       ((string= char "delta" ) "δ")
       ))
(insert funky-char)))

我搜索了读取字符串,但仍然对如何完成完成感到困惑。

如果您给我看一小段代码作为示例,我将不胜感激。

【问题讨论】:

  • 1.有TeX 输入法可以做到这一点。 2. 你是怎么写函数的?可以为read-string等函数生成完成列表。
  • 向我们展示你的函数的读取字符串部分。

标签: function emacs elisp


【解决方案1】:

如果您只需要 Unicode 字符,还有其他方法可以 解决问题:

  1. insert-char 绑定到 C-x 8 RET。 它已经完成,所以*alpha 将为您提供一切 里面有alpha
  2. 如果您只需要希腊字符,并且您使用的是 Linux, 您可以使用xmodmap 重新定义您的键盘: 每个键,如 w 不是两个,而是四个状态: 正常、移位、Mod4 和 Mod4+shift。 我的配置是这样的:w W ω Ω.
  3. 您可以使用yasnippet 来完成此任务。 和第二种方法一样,和第二种方法不同 首先和你的方法,它有一个很大的优势,它没有 打破你的心流:你不会因为不得不看而分心 在迷你缓冲区和/或阅读可能的选择 - 您只需输入您想要输入的内容并展开。
  4. expand-abbrev 类似于 yasnippet 但 更容易添加,因为每个缩写只是一个元素 在列表中,而不是文件中。但它没有 字段/镜像。

但这一切都取决于你想要做什么。

UPD 更正的代码版本

一旦候选人是唯一的,这个补全就会退出。

(defvar zz-minibuffer-map (copy-keymap minibuffer-local-must-match-map))

(define-key zz-minibuffer-map
  [remap self-insert-command] 'zz-self-insert-complete-and-exit)

(defun zz-self-insert-complete-and-exit (n)
  (interactive "p")
  (self-insert-command n)
  (ignore-errors
    (completion--do-completion nil 'expect-exact))
  (let ((candidates (completion-all-sorted-completions)))
    (cond
      ((null candidates)
       (backward-delete-char-untabify 1)
       (minibuffer-complete))
      ((eq 1 (safe-length candidates))
       (minibuffer-complete-and-exit)))))

(defun sp-char (char)
  "Insert some special chars."
  (interactive
   (list
    (let ((minibuffer-local-must-match-map zz-minibuffer-map))
      (completing-read "Input char name: " special-char-alist nil t))))
  (insert (cadr (assoc char special-char-alist))))

(defvar special-char-alist
  '(("Alpha" "Α")
    ("alpha" "α")
    ("Beta" "Β")
    ("beta" "β")
    ("Gamma" "Γ")
    ("gamma" "γ")
    ("Delta" "Δ")
    ("delta" "δ")))

【讨论】:

  • 为了完整起见,我会在列表中添加缩写。
  • 是的,起初我只想输入一些希腊字符和一些数学符号。您的解决方案足以输入这些字符。我会试一试。谢谢!
【解决方案2】:

使用completing-read 而不是read-string(或更糟的是read-from-minibuffer)。

【讨论】:

  • 谢谢我明白了!请一件事,如果我有两个列表,一个用于希腊字符,一个用于其名称,如何根据其名称获取相应的字符?抱歉新手问题,我刚开始学习 elisp :D
【解决方案3】:

这并没有具体回答你的问题,但它似乎适用于你的用例,所以我在这里发布。

一段时间以来,我一直在使用键盘映射插入希腊字母,而您的问题启发了我将其放入一个包中。这里是:

greek-unicode-insert

将它放在你的加载路径中,需要它,它会定义一个名为greek-unicode-insert-map的键映射。绑定到方便的地方

(global-set-key "\M-8" 'greek-unicode-insert-map)

您可以通过在字母后面键入前缀来快速插入希腊字母(和数学符号)。例如,M-8 b 插入测试版。

它还支持大写希腊字母(通过按住 shift)和一些字母的替代版本(通过按住 meta)。

【讨论】:

    【解决方案4】:

    C-x 8 RET 允许您按名称输入 Unicode 字符。使用 Icicles,您可以轻松匹配名称的任何部分。

    ucs-cmds.el 让您可以简单地定义一个命令来插入任何给定的Unicode 字符。您可以将此类命令绑定到键以扩展您的键盘。

    【讨论】:

      猜你喜欢
      • 2013-04-25
      • 2021-11-24
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多