我写了一个函数在“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)))
我搜索了读取字符串,但仍然混淆了如何完成完成。
如果你向我展示一小段代码,我会很感激。
答案 0 :(得分:5)
如果它只是你所追求的Unicode字符,还有其他方法 解决问题:
insert-char
绑定到 C-x 8 RET 。
它已经完成,所以*alpha
将为您提供一切
其中包含alpha
。xmodmap
重新定义键盘:
每个键,如w
,不是两个,而是四个州:
正常,移位,Mod4和Mod4 +移位。
我的配置如下: wWωΩ。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" "δ")))
答案 1 :(得分:3)
使用completing-read
而不是read-string
(或更糟,read-from-minibuffer
)。
答案 2 :(得分:0)
这并没有具体回答你的问题,但似乎适用于你的用例,所以我在这里发帖。
我一直在使用键盘映射来插入希腊字母已有一段时间了,而你的问题激发了我把它变成一个包。这是:
将它放在您的加载路径中,需要它,它将定义一个名为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字符的命令。您可以将这些命令绑定到键以扩展键盘。