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

Cyb*_*Luc 5 emacs elisp function

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

示例:当我键入"alpha"时,将插入该函数?.

但是当我输入这些字符时,我发现我无法使用自动完成功能.我将alpha as ?和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)))
Run Code Online (Sandbox Code Playgroud)

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

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

abo*_*abo 5

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

  1. 还有的insert-char必然C-x 8 RET.它已经完成,所以*alpha将为您提供一切alpha.
  2. 如果它只是你想要的希腊字符,并且你在Linux上,你可以xmodmap用来重新定义你的键盘:每个键,比如w不是两个,而是四个状态:normal,shift,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" "?")))
Run Code Online (Sandbox Code Playgroud)