Как я могу проверить, существует ли текущий буфер в Emacs?

Я хотел бы написать функцию, которая будет действовать, если заданное имя буфера уже существует. Например:

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

Есть ли у elisp функция, которая будет проверять наличие буфера, подобно тому, как это делает моя придуманная функция "buffer-exists"?

Спасибо


person oneself    schedule 25.02.2009    source источник


Ответы (4)


Из документации:

(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.
person Gareth Rees    schedule 25.02.2009
comment
Не следует ли использовать get-buffer в качестве аргумента для bufferp, чтобы убедиться, что это действительно буфер? (если (bufferp (get-buffer my-buffer-name); сделать что-нибудь) - person PuercoPop; 20.09.2012
comment
Нет необходимости использовать bufferp. Поскольку get-buffer возвращает либо nil, либо буфер, вы можете просто протестировать его напрямую: (let ((b (get-buffer "foo"))) (if b ...)) - person Gareth Rees; 21.09.2012

Вот что я сделал:

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

Это проверяет наличие царапины в буфере. Если есть такая вещь, убейте ее. Если нет, вообще ничего не делайте.

person Ole    schedule 29.04.2014
comment
Используйте when, если вам не нужно предложение else. - person ceving; 29.11.2016

не уверен в версии, в которой появился этот предикат, но теперь в Emacs есть 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.
person zarkone    schedule 11.08.2015
comment
Это не отвечает на вопрос. Вы должны ввести объект-буфер как OBJECT, а не имя буфера. Если вы передадите имя живого буфера как OBJECT, вы получите возвращаемое значение nil. Возможно, стоит сделать комментарий. - person Tobias; 11.08.2015
comment
это имеет смысл. Может быть, для этого нужно создать отдельный вопрос? я просто искал buffer-live-p функциональность и нашел только этот подход .. - person zarkone; 11.08.2015
comment
Это очень помогло мне, поскольку get-buffer вернет #<killed buffer>, а не nil, если буфер когда-то существовал! - person Alexander Griffith; 10.12.2016
comment
@AlexanderGriffith Я не смог воспроизвести это. После (kill-buffer scratch) и затем (get-buffer scratch) возвращает ноль. - person Talespin_Kit; 24.05.2021
comment
@Talespin_Kit Если вы запустите все это в одном скрипте, get-buffer вернет #<killed buffer>. Например, попробуйте запустить (let ((buffer (get-buffer-create "scratch"))) (kill-buffer buffer) (cons (buffer-live-p buffer) (get-buffer buffer))) - person Alexander Griffith; 08.06.2021

Если вы хотите определить свою гипотетическую функцию, как указано выше, это сработает:

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

Я использую это для автоматического закрытия буфера *scratch* при запуске, поэтому мне не нужно циклически просматривать его в моем списке буферов, как показано ниже:

(defun buffer-exists (bufname) (not (eq nil (get-buffer bufname))))
(if (buffer-exists "*scratch*")  (kill-buffer "*scratch*"))
person user249106    schedule 12.01.2010
comment
Обратите внимание, что (eq nil <foo>) то же самое, что (null <foo>) или (not <foo>), поэтому (not (eq nil (get-buffer bufname))) равно (not (not (get-buffer bufname))), поэтому вы можете отказаться от двойного отрицания и просто использовать (get-buffer bufname). После этого вы можете переопределить buffer-exists как псевдоним для get-buffer. - person Stefan; 21.11.2012
comment
@Stefan (придирка) Данный buffer-exists не совсем то же самое, что get-buffer, потому что он вернет либо t, либо nil, но не фактический буфер. - person Ken Wayne VanderLinde; 17.03.2017