gpt4 book ai didi

emacs - Emacs 中的命令是否有 `flet`?

转载 作者:行者123 更新时间:2023-12-05 00:22:37 25 4
gpt4 key购买 nike

我想将一个命令动态重定向到另一个命令
使用环绕建议的某些功能,如下所示:

(defun f1 (arg)
(interactive (list (read-from-minibuffer "F1: ")))
(message "f1: %S" arg)
arg)
(defun f2 (arg)
(interactive (list (read-from-minibuffer "F2: ")))
(message "f2: %S" arg)
arg)
;; Function that invokes the f1 command
(defun myfunc ()
(call-interactively 'f1))

;; I want myfunc to invoke f2 instead whenever it would invoke f1
(defadvice myfunc (around f1-to-f2 activate)
(flet ((f1 (&rest args) (interactive) (call-interactively 'f2)))
ad-do-it))

(myfunc)

但是,这会产生错误 (wrong-type-argument commandp f1) ,
表示当 flet重新定义了 f1功能,它没有
处理交互式表单并将其视为命令,因此它不能
call-interactively 调用.

是否有 flet 的变体这将适用于这种方式的命令?

(这是我想做的实际重新定义:)
(defadvice org-metaleft (around osx-command activate)
(flet ((backward-word (&rest args)
(interactive)
(call-interactively #'move-beginning-of-line)))
ad-do-it))

(defadvice org-metaright (around osx-command activate)
(flet ((forward-word (&rest args)
(interactive)
(call-interactively #'move-end-of-line)))
ad-do-it))

最佳答案

您在 flet 中遇到了一个愚蠢的错误:flet 的宏扩展将具有:(lambda (&rest args) (progn (interactive) (call-interactively 'f2))) .注意虚假 progn添加在那里,它“隐藏”了 interactive .

要获得更多控制(并同时避免 cl.el),您可以执行以下操作:

(defadvice myfunc (around f1-to-f2 activate)
(cl-letf (((symbol-function 'f1)
(lambda (&rest args)
(interactive) (call-interactively 'f2))))
ad-do-it))

关于emacs - Emacs 中的命令是否有 `flet`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29667809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com