2009-02-25 18 views
33

Vorrei scrivere una funzione che agisce se esiste già un nome buffer di memoria. Per esempio:Come posso verificare se esiste un buffer corrente in Emacs?

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

Fa elisp avere una funzione che controllerà la per l'esistenza di un buffer simile a come il mio costituito da "buffer-esiste" la funzione fa?

Grazie

risposta

49

Dal 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

non dovrebbe ottenere-buffer di essere usato come argomento per bufferp per verificare che sia davvero un buffer? (if (bufferp (get-buffer "my-buffer-name") ; fare qualcosa ) – PuercoPop

+4

Non è necessario utilizzare 'bufferp'. Poiché' get-buffer' restituisce 'nil' o un buffer, è possibile basta testarlo direttamente: '(let ((b (get-buffer" pippo "))) (se b ...))' –

3

Se vuoi definire la funzione ipotetica come sopra, questo funziona:

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

Io lo uso per chiudere automaticamente la *scratch* buffer all'avvio, quindi non è necessario visualizzarlo nel mio elenco di buffer, come segue:

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

Nota che '(eq nil )' è lo stesso di '(null )' o '(non )', quindi '(non (eq nil (get-buffer bufname)))' è '(non (non (get-buffer bufname)))', in modo da poter eliminare la doppia negazione e usare solo '(get-buffer bufname)' A questo punto è possibile ridefinire 'buffer-exists' come alias per' get-buffer'. – Stefan

+0

@Stefan (nitpick) Il dato 'buffer-exists' non è esattamente lo stesso di' get-buffer' perché restituirà 't' o 'nil', ma mai il buffer attuale. –

5

Questo è quello che ho fatto:

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

Questo controlla per il graffio del buffer. Se c'è una cosa del genere, uccidila. In caso contrario, non fare nulla.

+2

U se 'when', se non hai bisogno della clausola else. – ceving

2
non

sicuro circa la versione questo predicato è apparso, ma ora Emacs ha 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

Questo non risponde alla domanda. Devi inserire un oggetto buffer come "OBJECT" e non un nome di buffer. Se si passa un nome di un buffer vivente come 'OBJECT' si ottiene il valore di ritorno' nil'. Forse, vale comunque un commento. – Tobias

+0

questo fanno sence. Posso essere io a creare una domanda separata per questo? Ho appena cercato la funzionalità 'buffer-live-p' e ho trovato solo questo approccio .. – zarkone

+2

Questo mi ha aiutato notevolmente dal momento che' get-buffer' restituisce '# ' piuttosto che 'nil' se il buffer esisteva una volta ! –

Problemi correlati