定义调用另一个emacs命令的emacs命令(保留交互式东西)

时间:2009-10-20 09:10:43

标签: emacs command elisp interactive

如何定义执行某项操作的emacs命令X然后再调用另一个emacs命令Y并复制命令Y的交互式界面?

我想用case-fold-search的temporarilly切换值定义查询替换的替代版本:

(defun alt-query-replace (a b c d e)
  (interactive)
  (let ((case-fold-search (not case-fold-search))
    (query-replace a b c d e)))

这不起作用。当我调用alt-query-replace时,它会说“参数数量错误”。我希望alt-query-replace的交互式界面与query-replace相同。我是否需要检查查询替换的源代码,还是有一般方法?

2 个答案:

答案 0 :(得分:5)

如果要修改其行为而不是调用单独的函数,可以建议原始函数。

来自GNU Emacs Lisp参考手册的chapter 17.3 Around-Advice

  

Around-advice让你“包装”一个Lisp   表达“围绕”原始   功能定义。

 (defadvice foo (around foo-around)
   "Ignore case in `foo'."
   (let ((case-fold-search t))
     ad-do-it))

在你的情况下,你可以写:

(defadvice query-replace (around alt-query-replace (from-string to-string &optional delimited start end))
    (let ((case-fold-search (not case-fold-search)))
      ad-do-it))
(ad-activate 'query-replace)

答案 1 :(得分:4)

以交互方式使用呼叫:


(defun alt-query-replace ()
  (interactive)
  (let ((case-fold-search (not case-fold-search)))
    (call-interactively 'query-replace)))