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")