在emacs lisp中包装一个函数

时间:2010-10-24 19:01:44

标签: elisp

1987年,我写了一段时间我要粘贴的代码。这里用于捕获switch-to-buffer的初始函数绑定的机制不再起作用,导致无限递归。我想现在有一种正确的方法来做这种事情,有人可以请我填一下吗?

(defvar *real-buffer-switcher* nil)

(defun improve-buffer-switch ()
  (if *real-buffer-switcher* nil
    (setq *real-buffer-switcher* (symbol-function 'switch-to-buffer))
    (fset 'switch-to-buffer 'better-switch-to-buffer)
    t))

;(setq *real-buffer-switcher* (symbol-function 'switch-to-buffer))

(defun better-switch-to-buffer (buffer-name &optional no-record)
  (interactive "p") ; c-u c-x b goes ahead and creates. Note that
            ; buffer-name is fraudulently named so as to permit
            ; non-interactive calls.
  ;; first, filter out the noninteractive case.
  (if (or (stringp buffer-name)
      (bufferp buffer-name))
      (funcall *real-buffer-switcher* buffer-name no-record)
    ;; interactive. Numeric arg?
    (funcall *real-buffer-switcher*
         (read-buffer "Buffer name: "
              (other-buffer (current-buffer))
              (= buffer-name 1)))))

(improve-buffer-switch)

2 个答案:

答案 0 :(得分:3)

我不确定为什么过去工作的代码不再有效(除非你的*real-buffer-switcher*以某种方式设置为'better-buffer-switcher。你有什么理由不绑定 Cx b 您真正想要的例程并单独留下switch-to-buffer

像这样:

(defun better-switch-to-buffer (buffer-name &optional no-record)
  (interactive "p") 
  ;; interactive. Numeric arg?
  (switch-to-buffer
   (read-buffer "Buffer name: "
                (other-buffer (current-buffer))
                (= buffer-name 1))))

(global-set-key (kbd "C-x b") 'better-switch-to-buffer)

答案 1 :(得分:2)

似乎我的问题的正确答案是defadvice。