我有一段代码,它用三个常用名称之一“*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)) ...)
是等效的,但前者不遍历列表(因此更快)并且更符合惯用语。