2010-10-24 84 views
5

1987年,我編寫了我要粘貼的代碼。此處用於捕獲交換機到緩衝區的初始函數綁定的機制不再起作用,導致無限遞歸。我想現在有一種正確的方法來做這種事情,有人能讓我滿意嗎?在emacs lisp中包裝一個函數

(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) 

回答

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) 
+0

很久以前。我認爲有一個原因。 – bmargulies 2010-10-24 21:11:04

2

看來,正確的答案,我的問題是defadvice

+0

這是我的第一個想法,但如果你無法弄清楚爲什麼你做的事情是你最初做錯誤的事情,那就完全是過火了。 – 2010-10-25 01:57:22