2009-02-25 15 views
33

Me gustaría escribir una función que actúe si ya existe un nombre de búfer de entrega. Por ejemplo:¿Cómo puedo verificar si existe un buffer actual en Emacs?

(if (buffer-exists "my-buffer-name") 
    ; do something 
) 

¿Tiene elisp tienen una función que compruebe el de la existencia de un tampón similar a cómo mi formado por "buffer-existe" la función hace?

Gracias

Respuesta

49

Desde el documentation:

 
(get-buffer name) 

Return the buffer named name (a string). 
If there is no live buffer named name, return nil. 
name may also be a buffer; if so, the value is that buffer. 

(get-buffer-create name) 

Return the buffer named name, or create such a buffer and return it. 
A new buffer is created if there is no live buffer named name. 
If name starts with a space, the new buffer does not keep undo information. 
If name is a buffer instead of a string, then it is the value returned. 
The value is never nil. 
+0

no deben recibir tampón ser utilizado como un argumento a bufferp para comprobar que es de hecho un tampón? (if (bufferp (get-buffer "mi-nombre-búfer") ; ) – PuercoPop

+4

No es necesario usar 'bufferp'. Dado que' get-buffer' devuelve 'nil' o un buffer, puede simplemente pruébela directamente: '(let ((b (get-buffer" foo "))) (if b ...))' –

3

Si desea definir su hipotética función que el anterior, esto funciona:

(defun buffer-exists (bufname) (not (eq nil (get-buffer bufname)))) 

Lo utilizo para cerrar automáticamente el *scratch* búfer en el inicio, por lo que no tiene que recorrerlo en mi lista de almacenamientos intermedios, de la siguiente manera:

(defun buffer-exists (bufname) (not (eq nil (get-buffer bufname)))) 
(if (buffer-exists "*scratch*") (kill-buffer "*scratch*")) 
+5

Note que '(eq nil )' es lo mismo que '(nulo )' o '(no )', entonces '(no (eq nil (get-buffer bufname)))' is '(not (not (get-buffer bufname)))', para que pueda descartar la doble negación y simplemente usar '(get-buffer bufname)'. En ese punto puede redefinir 'buffer-exists' como un alias para' get-buffer'. – Stefan

+0

@Stefan (nitpick) El 'buffer-exists' dado no es exactamente lo mismo que' get-buffer' porque devolverá 't' o' nil', pero nunca el búfer real. –

5

Esto es lo que hice:

(when (get-buffer "*scratch*") 
    (kill-buffer "*scratch*")) 

Esto comprueba la memoria intermedia cero. Si hay tal cosa, mátalo. Si no, no haga nada en absoluto.

+2

U se 'when', si no necesita la cláusula else. – ceving

2
no

seguro acerca de la versión apareció este predicado, pero ahora Emacs tiene buffer-live-p:

buffer-live-p is a built-in function in `buffer.c'. 

(buffer-live-p OBJECT) 

Return non-nil if OBJECT is a buffer which has not been killed. 
Value is nil if OBJECT is not a buffer or if it has been killed. 
+0

Esto no responde la pregunta. Debes ingresar un objeto buffer como 'OBJECT' y no un nombre de buffer. Si pasa el nombre de un buffer de vida como 'OBJECT' obtendrá el valor de retorno' nil'. Quizás, vale la pena hacer un comentario. – Tobias

+0

esto hace sentir. Puede ser que debería crear una pregunta separada para esto? Acabo de buscar la funcionalidad 'buffer-live-p' y encontré solo este enfoque ... – zarkone

+2

Esto me ayudó considerablemente ya que' get-buffer' devolverá '# ' en vez de 'nil' si el buffer existió alguna vez ! –

Cuestiones relacionadas