get-buffer-window-list выдает ошибку в Emacs 24, если имя не найдено

369
pnj

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

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)) ...) 

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

Отлично. Переключатель версии Emacs был красной сельдью; Я удалил это из вопроса. pnj 11 лет назад 0

Похожие вопросы