代码之家  ›  专栏  ›  技术社区  ›  bmargulies

在Emacs Lisp中包装函数

  •  5
  • bmargulies  · 技术社区  · 14 年前

    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 回复  |  直到 14 年前
        1
  •  3
  •   Trey Jackson    14 年前

    我不知道为什么以前工作的代码不再工作(除非 *real-buffer-switcher* 不知怎的 'better-buffer-switcher . 你有什么理由不把它绑起来吗? C-X-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)
    
        2
  •  2
  •   bmargulies    14 年前

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