2010-10-24 16 views
5

En 1987, escribí el código que voy a pegar en un momento. El mecanismo utilizado aquí para capturar el enlace de función inicial de conmutar a búfer ya no funciona, lo que da como resultado una recursión infinita. Supongo que hay una manera correcta de hacer este tipo de cosas ahora, ¿podría alguien por favor llenarme?envuelve una función en 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) 

Respuesta

3

No estoy seguro de por qué el código que se utiliza para trabajar ya no funciona (a menos que su *real-buffer-switcher* de alguna manera se establece en 'better-buffer-switcher. ¿Hay alguna razón por la que no sólo ates Cx b la rutina que realmente quiere y dejar solos switch-to-buffer

así:?

(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

Fue hace mucho tiempo. Creo que hay una razón. – bmargulies

2

parece que la respuesta correcta a la pregunta es defadvice

.
+0

Eso fue lo primero que pensé, pero es una exageración total si no puedes entender por qué hiciste las cosas de la manera en que lo hiciste originalmente. –

Cuestiones relacionadas