2013-10-12 19 views
2

我想重写一些基本功能,比如说保存缓冲区(即使它没有意义,它是为了清晰起见),并给它一个新的定义。但我希望通过添加C-u来调用所有原始行为。如何用“少一个”C-u来调用原始函数?

所以,

  • C-X C-S成为我保存缓冲的新定义。

  • 铜CX铯将调用原始CX CS(无参数)

  • 铜铜CX铯将是相同的一样调用原CX铯与一个

和等:总是“少一个”铜...

现在,我测试了arg的值。如果无,我执行新的定义;否则,我调用交互式保存缓冲区(例如)。但是,然后,用一个C-u参数调用save-buffer。我看不出如何做“-1”C-u部分。

+0

你是如何从新的定义调用原始函数的? (如果可能,请显示代码。) –

+2

如果您还没有看过[21.12前缀命令参数](http://www.gnu.org/software/emacs/manual/html_node/elisp/Prefix- Command-Arguments.html)获取一些有关如何访问前缀参数的信息,以及如何为下一次调用设置它们。 –

回答

5

下面是做这件事:

(defun foo (arg) 
    (interactive "p") 
    (message "foo %s" arg)) 

(defun bar (arg) 
    (interactive "p") 
    (message "bar %s" arg)) 

(defmacro wrap (fg f g) 
    `(defun ,fg (arg) 
    (interactive "p") 
    (message "%s" arg) 
    (if (= 1 arg) 
     (funcall ,g 1) 
     (funcall ,f (/ arg 4))))) 

(wrap baz #'foo #'bar) 

现在一个普通的baz将调用bar。用C-u 它将调用foo,将给定的参数除以4.

相关问题