用于将键盘绑定到另一个键盘的Elisp代码

时间:2015-06-11 15:36:32

标签: emacs elisp

在Emacs中,为了将键盘绑定到另一个键盘,为什么这个elisp代码不起作用?

(global-set-key (kbd "C-f") (kbd "C-s"))

(在这个例子中,这个想法是为了得到" C-f"和" C-s"做同样的事情。)

2 个答案:

答案 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}}尊重当前的键盘映射,这可能会为键分配不同的功能。