2009-10-20 45 views
2

如何定义一个emacs命令X,它执行一些操作然后调用另一个emacs命令Y并且还复制命令Y的交互式界面?以案例倍的搜索的temporarilly触发值定义一个调用另一个emacs命令的emacs命令(保留交互式东西)

我想定义的altenative版本查询替换:

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

回答

4

使用呼叫交互式:


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

将这些代码会神奇地通过以'查询replace'通过所有ARGS,就好像是直接叫什么名字? – 2010-08-05 03:53:08

5

您可以告知原有的功能,如果你想改变自己的行为,而不是调用一个单独的功能。

从GNU的Emacs Lisp参考手册chapter 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) 
+0

我已经注意到人们有'ad-activate'与原始建议分开完成,但是您可以在原始行'alt-query-replace(...)activate'周围激活。 – 2009-10-20 23:20:45