我想一個命令動態地重定向到一個 某些函數中另一個周圍使用建議,這樣的事情:在Emacs中有沒有「flet」命令?
(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))
'(需要「CL-LIB),因爲'flet'不提供'是不夠的cl-lib(而不是cl.el)。 – Stefan
感謝您的提醒。 'cl-lib'用於循環宏,我忘記了'flet'沒有內置。另外,我一直在忘記哪個'flet'變體使用動態綁定,哪些使用詞法綁定。顯然我需要在這裏動態綁定。 –
@RyanThomson:是的,這很雜亂/混亂。它們背後的故事有助於:tho:'cl-lib'更新,因此'cl-flet'比'flet'更新,所以'cl-flet'的「自然」是詞法的(因爲詞法範圍更新在Emacs中)。至於'letf','f'來自'setf'而不是來自「let function」,所以它只是一種「設置...恢復」的方式,因此是動態範圍。 – Stefan