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

Posted

技术标签:

【中文标题】如何检查 Emacs 中是不是存在当前缓冲区?【英文标题】:How can I check if a current buffer exists in Emacs?如何检查 Emacs 中是否存在当前缓冲区? 【发布时间】:2010-10-09 20:39:16 【问题描述】:

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

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

elisp 是否有一个函数可以检查缓冲区是否存在,类似于我编写的“缓冲区存在”函数的功能?

谢谢

【问题讨论】:

【参考方案1】:

来自documentation:

(获取缓冲区名称) 返回名为 name 的缓冲区(字符串)。 如果没有名为 name 的实时缓冲区,则返回 nil。 name 也可以是一个缓冲区;如果是这样,则该值是该缓冲区。 (获取缓冲区创建名称) 返回名为 name 的缓冲区,或者创建这样的缓冲区并返回它。 如果没有名为 name 的活动缓冲区,则会创建一个新缓冲区。 如果名称以空格开头,则新缓冲区不保留撤消信息。 如果 name 是缓冲区而不是字符串,则它是返回的值。 该值永远不会为零。

【讨论】:

不应该使用 get-buffer 作为 bufferp 的参数来验证它确实是一个缓冲区吗? (if (bufferp (get-buffer "my-buffer-name") ;做某事) 无需使用bufferp。由于get-buffer 返回nil 或缓冲区,您可以直接对其进行测试:(let ((b (get-buffer "foo"))) (if b ...))【参考方案2】:

这就是我所做的:

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

这会检查缓冲区划痕。如果有这种事,杀了它。 如果没有,什么也不做。

【讨论】:

如果不需要 else 子句,请使用 when【参考方案3】:

不确定这个谓词出现的版本,但现在 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 @AlexanderGriffith 我无法重现这一点。在 (kill-buffer "scratch") 之后 (get-buffer "scratch") 返回 nil。 @Talespin_Kit 如果你在一个脚本中运行它,get-buffer 将返回#<killed buffer>。例如,尝试运行(let ((buffer (get-buffer-create "scratch"))) (kill-buffer buffer) (cons (buffer-live-p buffer) (get-buffer buffer)))【参考方案4】:

如果您想像上面那样定义假设函数,这可行:

(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 的别名。 @Stefan (nitpick) 给定的buffer-existsget-buffer 不完全相同,因为它将返回tnil,但绝不会返回实际缓冲区。

以上是关于如何检查 Emacs 中是不是存在当前缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

如何在emacs中自动关闭自动加密模式缓冲区?

如何在 Emacs 中保存所有文件(或保存所有缓冲区)?

如何在emacs中进行缓冲区拆分后切换焦点?

在迷你缓冲区中显示当前文件完整路径的功能

在 Emacs 中,如何根据缓冲区名称自动启用次要模式?

EMACS快捷键