Emacs 将函数传递给elisp中的参数
我将以下代码添加到我的Emacs 将函数传递给elisp中的参数,emacs,elisp,Emacs,Elisp,我将以下代码添加到我的.emacs文件中 (defun delete-right-window () (interactive) (windmove-right) (delete-window)) (defun delete-left-window () (interactive) (windmove-left) (delete-window)) (defun delete-below-window () (interactive) (windmove-dow
.emacs
文件中
(defun delete-right-window ()
(interactive)
(windmove-right)
(delete-window))
(defun delete-left-window ()
(interactive)
(windmove-left)
(delete-window))
(defun delete-below-window ()
(interactive)
(windmove-down)
(delete-window))
(defun delete-above-window ()
(interactive)
(windmove-up)
(delete-window))
(global-set-key (kbd "C-s-<right>") 'delete-right-window)
(global-set-key (kbd "C-s-<left>") 'delete-left-window)
(global-set-key (kbd "C-s-<down>") 'delete-below-window)
(global-set-key (kbd "C-s-<up>") 'delete-above-window)
我像这样绑定击键:
(global-set-key (kbd "C-s-<right>") 'delete-right)
(全局设置键(kbd“C-s-”)删除右键)
但是当我点击C-s-
时,它不起作用,只在小缓冲区中显示错误类型参数:commandp,delete right
我遗漏了什么,或者我应该做什么才能正确地使用代码?这里有一个修复方法:
(在(fn)之后取消删除)
`(lambda()(交互式)
(,fn)
(删除窗口)))
(全局设置键(kbd“C-s-”)(在“windmove right”之后删除))
(全局设置键(kbd“C-s-”)(在“windmove left”之后删除))
(全局设置键(kbd“C-s-”)(在“windmove down”之后删除))
(全局设置键(kbd“C-s-”)(在“windmove up”之后删除))
要将一个函数变成一个命令,您需要向其添加特殊的表单交互式
:
(defun delete-right ()
(interactive)
(delete-other-window 'windmove-right))
代码的问题在于,与键绑定的函数应该是交互式的。它调用的函数中没有一个:
(defun delete-other-window (callback)
(funcall callback)
(delete-window))
(defun delete-right ()
(interactive)
(delete-other-window 'windmove-right))
您还可以使用宏:
(defmacro defun-delete-other-window (direction)
`(defun ,(intern (concat "delete-" direction)) ()
(interactive)
(,(intern (concat "windmove-" direction)))
(delete-window)))
(defun-delete-other-window "right")
好的,这里我们有一个刚刚开始学习elisp的用户。你真的认为用函数生成匿名函数来解决这个问题是个好主意吗?使用lambda和backticks等高级技巧生成匿名函数,特别是当他已经有了一个简单、直接的方法来实现它的时候。在提出问题之前,op的实施问题已经得到了明确的解决。OP要求优雅,我把它展示给他看。把一只羔羊绑在钥匙上或是把它放在钩子上从来都不优雅。当用户检查密钥绑定到什么或钩子包含什么时,匿名lambda就像一条死胡同,在我的Emacs中有一堆碎石(当然是盐粒),f1 k显示匿名lambda的代码。有人可能会说它更有效,因为我不必跳转到定义来查看源代码:)Hi indydancer。我期望有很多不同的答案。同样的答案不那么有价值。你不这么认为吗?所以abo abo的回答对我来说很有价值。我认为OP只是一个期待答案的人。所以你们不需要答案,若你们有另一个可能的答案,请张贴它。谢谢。宏方法的一个小缺点是,您不能再跳转到的定义,例如,
windmove right
。感谢您告诉我,交互式
应该在绑定到击键的函数中。将interactive
移动到delete right
后,它工作正常。interactive
应该位于与击键绑定的函数中。非常感谢。
(defmacro defun-delete-other-window (direction)
`(defun ,(intern (concat "delete-" direction)) ()
(interactive)
(,(intern (concat "windmove-" direction)))
(delete-window)))
(defun-delete-other-window "right")