如果未找到名称,get-buffer-window-list 在 Emacs 24 中会抛出错误

如果未找到名称,get-buffer-window-list 在 Emacs 24 中会抛出错误

我有一段代码,它用三个常用名称之一“*shell*”、“*stata*”、“stata”来查找打开的窗口。

我正在运行以下 elisp 代码来检查每个名称:

(setq stata-win (get-buffer-window-list "*shell*"))
(if (eq (length stata-win) 0) (setq stata-win (get-buffer-window-list "*stata*")))
(if (eq (length stata-win) 0) (setq stata-win (get-buffer-window-list "stata")))

(car stata-win)

以前这种方法有效,但现在如果出现名为未找到。如何测试是否存在与名称匹配的打开窗口,而不会在未找到名称时触发错误?

答案1

get-buffer-window-list仅当缓冲不存在。如果缓冲区存在,但是没有显示在任何窗口中,则函数返回nil

您可以使用以下方法检查缓冲区是否存在get-buffer

因此,你想要的是:

(defun get-buffers-window (buffer-names)
  (let (found buf)
    (while (and (null found)
                (setq buf (pop buffer-names)))
      (setq found
            (and (get-buffer buf)
                 (car (get-buffer-window-list buf)))))
    found))
(get-buffers-window '("*shell*" "stata" "*stata*"))

请注意,对于列表foo形式

(if foo ...)

(if (< 0 (length foo)) ...)

是等效的,但前者不遍历列表(因此更快)并且更符合惯用语。

相关内容