get-buffer-window-list génère une erreur dans Emacs 24 si le nom n'est pas trouvé

1

J'ai un code qui recherche une fenêtre ouverte avec l'un des trois noms couramment utilisés, "* shell *", "* stata *", "stata".

J'utilise le code elisp suivant pour vérifier chaque nom:

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

Cela fonctionnait auparavant, mais la première ligne déclenche maintenant une erreur si une fenêtre avec le nom coquille n'est pas trouvé. Comment puis-je tester l'existence d'une fenêtre ouverte correspondant à un nom sans provoquer d'erreur si le nom n'est pas trouvé?

pnj
la source

Réponses:

0

get-buffer-window-list erreurs sur que si le tampon n'existe pas. Si le tampon existe mais ne s'affiche dans aucune fenêtre, la fonction retourne nil.

Vous pouvez vérifier l'existence d'un tampon en utilisant get-buffer.

Ainsi, ce que vous voulez c'est:

(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*"))

Notez que pour les listes foo les formulaires

(if foo ...)

et

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

sont équivalents, mais le premier ne traverse pas la liste (et donc plus rapide) et aussi plus idiomatique.

sds
la source
Excellent. Le commutateur de version d’Emacs était un fouillis rouge; Je l'ai retiré de la question.
pnj