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)
我搜索了读取字符串,但仍然混淆了如何完成完成.
如果你向我展示一小段代码,我会很感激.
如果它只是你所追求的Unicode字符,还有其他方法可以解决这个问题:
insert-char必然C-x 8 RET.它已经完成,所以*alpha将为您提供一切alpha.xmodmap用来重新定义你的键盘:每个键,比如w不是两个,而是四个状态:normal,shift,Mod4和Mod4 + shift.我这样配置:w W ω Ω.yasnippet来完成此任务.就像第二种方法一样,它与第一种方法和你的方法不同,它有一个很大的优势,它不会破坏你的流量:你不必分心看迷你缓冲区和/或阅读可能的选择 - 你只是键入您要键入和扩展的内容.expand-abbrev类似于yasnippet但更容易添加,因为每个缩写只是列表中的一个元素,而不是文件.但它没有字段/镜像.但这一切都取决于你想要做什么.
候选人独有后,此完成将立即退出.
(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)