2

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

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

(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 相同。我需要检查查询替换的源代码还是有通用方法?

4

2 回答 2

5

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

从GNU Emacs Lisp 参考手册的第 17.3 章开始:

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)
于 2009-10-20T12:32:48.940 回答
4

以交互方式使用调用:


(defun alt-query-replace ()
  (interactive)
  (let ((case-fold-search (not case-fold-search)))
    (call-interactively 'query-replace)))
于 2009-10-20T10:15:59.107 回答