¿Cómo contar todas las ventanas en un marco?

10

Justo como decía la pregunta, me gustaría una función que contara las ventanas que se muestran actualmente en ese marco.

Así que esto:

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

Volvería => 3

Comencé una función a continuación:

(defun count-windows ()
  "Count how many buffers are currently being shown."
  (interactive)
)
Luke Shimkus
fuente
2
¿Te refieres a la cantidad de ventanas o la cantidad de buffers únicos visibles en las ventanas?
Dan
3
En el ejemplo dado, tiene 3 ventanas que muestran 3 buffers diferentes. Si, digamos, se mostraran 2 de esas ventanas *scratch*, ¿le gustaría que la función devuelva 3 o 2?
Dan
@Dan, perdón por el malentendido, y me gustaría que la función devuelva 3 todavía.
Luke Shimkus
1
Lo tengo: la respuesta a continuación ofrece ambas opciones: parece que quieres la más simple ( count-windows).
Dan

Respuestas:

21

Si te refieres a la cantidad de ventanas independientemente de los buffers que se muestran, entonces: (length (window-list))lo hará. Mejor aún, puede usar la (count-windows)función existente .

Si desea contar el número de buffers únicos visibles en las ventanas del marco, puede usar:

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

(Tenga en cuenta que window-listtambién puede tomar un argumento FRAME opcional si desea algo diferente al marco seleccionado).

Si envuelve este último en su llamada de función, obtendrá:

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

(Tenga en cuenta que esta función asume que ha cargado 'cl-lib. Según los comentarios, puede usarlo delete-dupsen lugar de cl-delete-duplicatessi desea evitarlo cl-lib).

Dan
fuente
2
+1 Gran respuesta! La única información que falta es que cl-delete-duplicatesdebe estar disponible por requireing cl.
itsjeyd
1
Buena captura, gracias. He editado la respuesta para mencionarlo.
Dan
1
¿Conoces una forma o función que no requiera que cargues 'cl-lib?
Luke Shimkus
3
En realidad, sí: resulta delete-dupsque también funcionaría, y no requiere 'cl-lib.
Dan