【问题标题】:wrap a function in emacs lisp在 emacs lisp 中包装一个函数
【发布时间】:2010-10-25 05:11:28
【问题描述】:

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)

【问题讨论】:

    标签: elisp


    【解决方案1】:

    我不确定为什么以前可以工作的代码不再工作(除非你的 *real-buffer-switcher* 以某种方式设置为 'better-buffer-switcher。你有什么理由不只是绑定 C-x b kbd> 你真正想要的例程,让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)
    

    【讨论】:

    • 那是很久以前的事了。我认为是有原因的。
    【解决方案2】:

    看来我的问题的正确答案是defadvice。

    【讨论】:

    • 这是我的第一个想法,但如果你无法弄清楚为什么要以最初的复杂方式做事,那就太矫枉过正了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多