2013-10-12 18 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.

相關問題