1

У меня есть код, который ищет открытое окно с одним из трех обычно используемых имен, "* 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 ответ1

0

Ошибки 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)) ...)

эквивалентны, но первый не пересекает список (и, следовательно, быстрее), а также более идиоматичен.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .