Como contar todas as janelas em um quadro?

10

Assim como a pergunta afirmou, eu gostaria de uma função que contasse as janelas que estão sendo mostradas atualmente nesse quadro.

Então, é isso:

+--------------+-------------+
|              |             |
|              |             |
|  *scratch*   | *Messages*  |
|              |             |
|              |             |
|              |             |
+--------------+-------------+
|           *Help*           |
|                            |
+----------------------------+

Retornaria => 3

Comecei uma função abaixo:

(defun count-windows ()
  "Count how many buffers are currently being shown."
  (interactive)
)
Luke Shimkus
fonte
2
Você quer dizer o número de janelas ou o número de buffers exclusivos visíveis nas janelas?
Dan
3
No exemplo dado, você tem 3 janelas mostrando 3 buffers diferentes. Se, por exemplo, duas dessas janelas estiverem aparecendo *scratch*, você deseja que a função retorne 3 ou 2?
Dan
@ Dan, desculpe pelo mal-entendido, e eu teria a função de retornar 3 ainda.
Luke Shimkus
11
Entendi - a resposta abaixo fornece as duas opções: parece que você deseja a mais simples ( count-windows).
Dan

Respostas:

21

Se você quer dizer o número de janelas, independentemente de quais buffers estão sendo exibidos, então: (length (window-list))fará isso. Melhor ainda, você pode simplesmente usar a (count-windows)função existente .

Se você quiser contar o número de buffers exclusivos visíveis nas janelas do quadro, poderá usar:

(length (cl-delete-duplicates (mapcar #'window-buffer (window-list))))

(Observe que window-listtambém é possível usar um argumento FRAME opcional se você quiser algo diferente do quadro selecionado.)

Ao agrupar o último em sua chamada de função, você terá:

(defun count-unique-visible-buffers (&optional frame)
  "Count how many buffers are currently being shown.  Defaults to
selected frame."
  (length (cl-delete-duplicates (mapcar #'window-buffer (window-list frame)))))

(Observe que esta função supõe que você tenha carregado 'cl-lib. Conforme os comentários, você pode usá-lo delete-dupsno lugar de cl-delete-duplicatesse quiser evitar cl-lib.)

Dan
fonte
2
+1 Ótima resposta! A única informação que falta é que cl-delete-duplicatesprecisa ser disponibilizada por requireing cl.
itsjeyd
11
Boa captura, obrigado. Eu editei a resposta para mencioná-lo.
Dan
11
Você conhece uma maneira ou função que não exige que você carregue 'cl-lib?
Luke Shimkus
3
Na verdade, sim: acontece delete-dupsque também funcionaria e não requer 'cl-lib.
Dan