【发布时间】:2010-10-09 20:39:16
【问题描述】:
我想编写一个函数,如果给定的缓冲区名称已经存在,它会采取行动。例如:
(if (buffer-exists "my-buffer-name")
; do something
)
elisp 是否有一个函数可以检查缓冲区是否存在,类似于我编写的“缓冲区存在”函数的功能?
谢谢
【问题讨论】:
我想编写一个函数,如果给定的缓冲区名称已经存在,它会采取行动。例如:
(if (buffer-exists "my-buffer-name")
; do something
)
elisp 是否有一个函数可以检查缓冲区是否存在,类似于我编写的“缓冲区存在”函数的功能?
谢谢
【问题讨论】:
【讨论】:
bufferp。由于get-buffer 返回nil 或缓冲区,您可以直接对其进行测试:(let ((b (get-buffer "foo"))) (if b ...))
这就是我所做的:
(when (get-buffer "*scratch*")
(kill-buffer "*scratch*"))
这会检查缓冲区划痕。如果有这种事,杀了它。 如果没有,什么也不做。
【讨论】:
when。
不确定这个谓词出现的版本,但现在 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.
【讨论】:
OBJECT 而不是缓冲区名称。如果您将活动缓冲区的名称传递为OBJECT,您将获得返回值nil。也许,这值得评论。
buffer-live-p 功能,发现只有这种方法..
get-buffer 将返回 #<killed buffer> 而不是 nil!
get-buffer 将返回#<killed buffer>。例如,尝试运行(let ((buffer (get-buffer-create "scratch"))) (kill-buffer buffer) (cons (buffer-live-p buffer) (get-buffer buffer)))
如果您想像上面那样定义假设函数,这可行:
(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*"))
【讨论】:
(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 的别名。
buffer-exists 与get-buffer 不完全相同,因为它将返回t 或nil,但绝不会返回实际缓冲区。