5

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

示例:当我键入“alpha”时,该函数将α改为插入。

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

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

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

抱歉,我还是 emacs 新手,昨天才开始写 elisp 函数。

我只是用一种直接的方式来实现这个功能,使用interactivewith codes来读取字符串

这就是为什么我想知道如何完成自动完成。因为我没有找到任何关于这些事情的教程。也许是因为我缺乏 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)))

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

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

4

4 回答 4

5

如果它只是你所追求的 Unicode 字符,还有其他方法可以解决这个问题:

  1. insert-char必然的C-x 8 RET。它已经完成,所以*alpha会给你所有alpha的东西。
  2. 如果它只是你所追求的希腊字符,并且你在 Linux 上,你可以用它xmodmap来重新定义你的键盘:每个键,w不是两个,而是四个状态:正常、移位、Mod4 和 Mod4+shift。我的配置是这样的:w W ω Ω.
  3. 你可以yasnippet用来完成这个任务。与第二种方法一样,与第一种方法和您的方法不同,它有一个很大的优势,即它不会破坏您的流程:您不会因为必须查看 minibuffer 和/或阅读可能的选择而分心 - 您只需输入您想要输入的内容并展开。
  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" "δ")))
于 2013-07-28T07:35:54.973 回答
3

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

于 2013-07-28T06:47:01.353 回答
0

这并没有具体回答您的问题,但它似乎适用于您的用例,因此我将其发布在这里。

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

希腊-unicode-插入

将它放在你的加载路径中,需要它,它会定义一个名为greek-unicode-insert-map. 把它绑定到方便的东西上

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

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

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

于 2013-07-28T22:02:09.943 回答
0

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

ucs-cmds.el允许您轻松定义插入任何给定 Unicode 字符的命令。您可以将此类命令绑定到键以扩展键盘。

于 2013-08-10T21:38:34.403 回答