如何检查Emacs中是否存在当前缓冲区?

one*_*elf 37 emacs elisp

我想编写一个函数,如果已经存在一个给定缓冲区名称,它将采取行动.例如:

(if (buffer-exists "my-buffer-name")
    ; do something
 )
Run Code Online (Sandbox Code Playgroud)

elisp是否有一个函数来检查是否存在类似于我的"缓冲存在"函数的缓冲区的存在?

谢谢

Gar*_*ees 55

文档:

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

  • 不需要使用`bufferp`.由于`get-buffer`返回`nil`或缓冲区,你可以直接测试它:`(let((b(get-buffer"foo")))(如果b ...))` (4认同)

Ole*_*Ole 6

这就是我做的:

(when (get-buffer "*scratch*")
  (kill-buffer "*scratch*"))
Run Code Online (Sandbox Code Playgroud)

这将检查缓冲区划痕.如果有这样的事情,就杀掉它.如果没有,什么都不做.

  • 如果你不需要else子句,请使用`when`. (4认同)

zar*_*one 6

不确定这个谓词出现的版本,但现在 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.
Run Code Online (Sandbox Code Playgroud)

  • 这对我有很大帮助,因为如果缓冲区曾经存在,`get-buffer` 将返回 `#<killed buffer>` 而不是 `nil`! (2认同)

小智 5

如果你想定义你的假设函数如上,这有效:

(defun buffer-exists (bufname)   (not (eq nil (get-buffer bufname))))
Run Code Online (Sandbox Code Playgroud)

我使用它*scratch*在启动时自动关闭缓冲区,因此我不必在我的缓冲区列表中循环它,如下所示:

(defun buffer-exists (bufname) (not (eq nil (get-buffer bufname))))
(if (buffer-exists "*scratch*")  (kill-buffer "*scratch*"))
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`(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` 的别名。 (5认同)