定义我自己的函数时如何设置完成

时间:2013-07-28 03:48:21

标签: function emacs elisp

我写了一个函数在“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)))

我搜索了读取字符串,但仍然混淆了如何完成完成。

如果你向我展示一小段代码,我会很感激。

4 个答案:

答案 0 :(得分:5)

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

  1. insert-char绑定到 C-x 8 RET 。 它已经完成,所以*alpha将为您提供一切 其中包含alpha
  2. 如果你只是希腊人的角色,那你就是Linux, 您可以使用xmodmap重新定义键盘: 每个键,如w,不是两个,而是四个州: 正常,移位,Mod4和Mod4 +移位。 我的配置如下: wWωΩ
  3. 您可以使用yasnippet来完成此任务。 像第二种方法一样,与之不同 首先,你的方法,它有一个很大的优势,它没有 打破你的流动:你不必分心 在迷你缓冲区和/或阅读可能的选择 - 您只需键入要键入和展开的内容即可。
  4. expand-abbrevyasnippet类似,但是 更容易添加,因为每个缩写只是一个元素 在列表中,而不是文件。但它没有 场/反射镜。
  5. 但这一切都取决于你想要做什么。

    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" "δ")))
    

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

我一直在使用键盘映射来插入希腊字母已有一段时间了,而你的问题激发了我把它变成一个包。这是:

greek-unicode-insert

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

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

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

它还支持大写希腊字母(通过持有移位)和一些字母的替代版本(通过持有元)。

答案 3 :(得分:0)

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

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