如何在Common Lisp(LispBox)中绑定键盘宏到按键并持久化?
解决方案
你猜的完全正确:fset、global-set-key都是Emacs Lisp(Elisp)的专属函数,并非Common Lisp标准函数。LispBox本质是Emacs + SLIME + Common Lisp运行时的整合环境,按键绑定需要区分「Emacs全局层面」和「SLIME/Common Lisp会话层面」两种场景:
场景1:给Emacs全局绑定快捷键(全缓冲区生效)
如果希望快捷键在所有Emacs缓冲区(包括SLIME的Common Lisp会话)都生效,这段代码应该写在Emacs的配置文件中(比如~/.emacs或~/.emacs.d/init.el),而非Common Lisp的REPL里。修正后的Elisp代码如下:
(fset 'macro1 (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item '("uuu" 0 "%d") arg))) (global-set-key (kbd "<f5>") 'macro1)
注意:Elisp中正确的按键表示是(kbd "<f5>"),而非你之前用的"[f5]"。修改配置后,重启Emacs或执行M-x eval-buffer即可生效。
场景2:仅给SLIME/Common Lisp会话绑定快捷键
如果只需要在SLIME的REPL或Common Lisp代码缓冲区生效,使用SLIME提供的Common Lisp接口slime-set-key,在Common Lisp环境中执行:
;; 先确保macro1是可在CL环境运行的函数 (setf (symbol-function 'macro1) (lambda (&optional arg) ;; 这里写你的Common Lisp逻辑,而非Elisp的键盘宏代码 (format t "执行macro1,参数:~a~%" arg))) ;; 绑定F5快捷键 (slime-set-key (kbd "<f5>") 'macro1)
如果你的需求是执行Emacs键盘宏,还是推荐用场景1的Emacs全局配置,因为键盘宏本身是Emacs层面的功能。
内容的提问来源于stack exchange,提问作者Mathiuston
相关产品推荐
相关产品推荐

