我想在此之前建议一些使用交互式参数的函数,例如find-dired
(defadvice find-dired (before eab-find-dired activate)
(message "before!")
(setq find-args '("-iname '**'" . 10)))但是find-args只有在find-dired交互会话之后才会执行这个建议,而我之前不能设置emacs。如何解决这一矛盾?
Upd。请注意,defadvice宏为deprecated。
发布于 2013-01-30 23:41:55
Emacs在调用函数之前获取interactive规范。
一般来说,使用defadvice不是一个好主意,因此我建议您定义自己的函数并将其绑定到适当的键。例如:
(defun my-find-dired ()
(interactive)
(let ((find-args '("-iname '**'" . 10)))
(call-interactively 'find-dired)))当然,如果您认为所有对find-dired的调用都需要此设置,也可以简单地执行以下操作
(setq find-args '("-iname '**'" . 10))发布于 2013-01-31 00:05:27
为什么你想建议一个交互式功能?
您可以轻松地定义自己的命令
(defun find-dired-my-defaults (dir args)
"just like `find-dired' but with defaults."
(interactive
(list (read-directory-name "Run find in directory: " nil "" t)
(read-string "Run find (with args): " '("-iname '**'" . 1)
'(find-args-history . 1))))
(find-dired dir args))如果它已经绑定在一个键映射中,你可以很容易地重新映射它:
(define-key foo-mode-map [remap find-dired] 'find-dired-my-defaults)不管维基告诉你什么,最终用户几乎从来不需要使用defadvice。
编辑:@Lindydancer的答案在这种情况下更好,但我将在这里留下这个答案,以劝阻未来的读者以这种人为的方式使用defadvice。
发布于 2013-01-30 23:45:04
它是有效的:
(defadvice find-dired (around eab-find-dired (dir args) activate)
(interactive
(list (read-directory-name "Run find in directory: " nil "" t)
(read-string "Run find (with args): " '("-iname '**'" . 10)
'(find-args-history . 1))))
ad-do-it)我使用函数find-dired的interactive form进行替换:将必要的表达式'("-iname '**'" . 10)直接放入表单中,而不是find-args。使用带有参数(dir args)的around-advice,而不是before-advice。
https://stackoverflow.com/questions/14606037
复制相似问题