在Emacs中,为了将键盘绑定到另一个键盘,为什么这个elisp代码不起作用?
(global-set-key (kbd "C-f") (kbd "C-s"))
(在这个例子中,这个想法是为了得到" C-f"和" C-s"做同样的事情。)
答案 0 :(得分:2)
我不知道为什么它也不起作用,但实现目的的通常方法是将一个键绑定到交互式命令,而不是字符串或键盘宏,在这种情况下(kbd "C-s")
:
(global-set-key (kbd "C-f") #'isearch-forward)
或(以上情况更好)
(global-set-key (kbd "C-f") (key-binding (kbd "C-s")))
答案 1 :(得分:1)
根据文档,我希望以下内容是真实的:您尝试的内容不起作用,因为您将(kbd "C-s")
的结果绑定到一个键,这是一个键内部Emacs键表示,而不是(全局)设置为键的函数。然而,正如徐春阳指出的那样,这并不完全正确。 global-set-key
在内部调用define-key
,其文档中包含以下部分:
(define-key KEYMAP KEY DEF)
在KEYMAP中,将键序列KEY定义为DEF。 KEYMAP是一个关键图。
KEY是一个字符串或符号和字符的向量,表示一个 键击和事件的序列。 [...] DEF是任何可以成为关键定义的东西:
nil(表示键在此键映射中未定义),
命令(适用于交互式呼叫的Lisp函数),
一个字符串(被视为键盘宏),[...]
事实上,xunchunyang的例子(global-set-key [?l] (kbd "C-f")
按预期工作。 (global-set-key [?l] (kbd "C-s")
无法正常工作,因为isearch-forward
需要interactive
要求的参数(搜索正则表达式)。只有你提供一个,这个特定的键盘宏才能工作,即(global-set-key [?l] (concat (kbd "C-s") "foo"))
将绑定搜索" foo"关键" l"。
xuchunyang的答案是绝对正确的:最好的方法是通过(global-set-key (kbd "C-f") #'isearch-forward)
明确命名函数。
您可以通过键入C-h k
然后键入您想要的键来轻松找出绑定到键的功能:#34; copy&#34 ;: C-h k C-s
)会向您显示C-s
(通常,参见下文)绑定到isearch-forward
。
在一般情况下,使用key-binding
的方法会导致奇怪的结果:取决于您执行此操作的位置和方式(即在某个缓冲区或.emacs中交互式),结果可能会有所不同,因为{ {1}}尊重当前的键盘映射,这可能会为键分配不同的功能。