Comment compter toutes les fenêtres d'un cadre?

10

Tout comme la question l'indique, je voudrais une fonction qui compterait les fenêtres actuellement affichées dans ce cadre.

Donc ça:

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

Retournerais => 3

J'ai commencé une fonction ci-dessous:

(defun count-windows ()
  "Count how many buffers are currently being shown."
  (interactive)
)
Luke Shimkus
la source
2
Voulez-vous dire le nombre de fenêtres ou le nombre de tampons uniques visibles dans les fenêtres?
Dan
3
Dans l'exemple donné, vous avez 3 fenêtres affichant 3 tampons différents. Si, disons, 2 de ces fenêtres étaient affichées *scratch*, voudriez-vous que la fonction renvoie 3 ou 2?
Dan
@Dan, désolé pour le malentendu, et je voudrais que la fonction retourne encore 3.
Luke Shimkus
1
J'ai compris - la réponse ci-dessous donne les deux options: il semble que vous souhaitiez la plus simple ( count-windows).
Dan

Réponses:

21

Si vous voulez dire le nombre de fenêtres, quels que soient les tampons affichés, alors: le (length (window-list))fera. Mieux encore, vous pouvez simplement utiliser la (count-windows)fonction existante .

Si vous souhaitez compter le nombre de tampons uniques visibles dans les fenêtres du cadre, vous pouvez utiliser:

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

(Notez que window-listpeut également prendre un argument FRAME facultatif si vous voulez autre chose que le cadre sélectionné.)

Envelopper ce dernier dans votre appel de fonction vous donnera:

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

(Notez que cette fonction suppose que vous avez chargé 'cl-lib. Selon les commentaires, vous pouvez utiliser delete-dupsà la place de cl-delete-duplicatessi vous voulez éviter cl-lib.)

Dan
la source
2
+1 Excellente réponse! La seule information qui manque est celle qui cl-delete-duplicatesdoit être mise à disposition par requireing cl.
itsjeyd
1
Bonne prise, merci. J'ai édité la réponse pour le mentionner.
Dan
1
Connaissez-vous un moyen ou une fonction qui ne nécessite pas de chargement 'cl-lib?
Luke Shimkus
3
En fait, oui: il s'avère que delete-dupscela fonctionnerait également, et ne nécessite pas 'cl-lib.
Dan