如何使用"少一个调用原始功能" C-ù?

时间:2013-10-12 19:49:24

标签: emacs lisp elisp

我想覆盖一些基本功能,让我们说保存缓冲区(即使它没有意义,它是为了清晰起见),并给它一个新的定义。但我希望通过添加C-u来调用所有原始行为。

所以,

  • C-x C-s成为我对保存缓冲区的新定义。

  • C-u C-x C-s会调用原来的C-x C-s(不带参数)

  • C-u C-u C-x C-s与使用 1调用原始C-x C-s相同 C-u

依此类推:总是“少一点”C-u ...

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

1 个答案:

答案 0 :(得分: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,将给定的arg除以4。