Come contare tutte le finestre in una cornice?


10

Proprio come la domanda affermava, vorrei una funzione che potesse contare delle finestre che vengono attualmente mostrate in quel frame.

Così questo:

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

Ritornerei => 3

Ho iniziato una funzione di seguito:

(defun count-windows ()
  "Count how many buffers are currently being shown."
  (interactive)
)

2
Intendi il numero di finestre o il numero di buffer univoci visibili in Windows?
Dan

3
Nell'esempio fornito, hai 3 finestre che mostrano 3 diversi buffer. Se, diciamo, 2 di quelle finestre fossero visualizzate *scratch*, vorresti che la funzione restituisse 3 o 2?
Dan

@Dan, scusami per l'incomprensione, e vorrei che la funzione restituisse ancora 3.
Luke Shimkus,

1
Capito - la risposta sotto fornisce entrambe le opzioni: sembra che tu voglia quello più semplice ( count-windows).
Dan

Risposte:


21

Se intendi il numero di finestre indipendentemente da quali buffer vengono visualizzati, allora: (length (window-list))lo farà. Meglio ancora, puoi semplicemente usare la (count-windows)funzione esistente .

Se si desidera contare il numero di buffer univoci visibili in Windows sul frame, è possibile utilizzare:

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

(Nota che window-listpuoi anche prendere un argomento FRAME opzionale se vuoi qualcosa di diverso dal frame selezionato.)

Avvolgere quest'ultimo nella chiamata di funzione ti darà:

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

(Si noti che questa funzione presuppone che sia stata caricata 'cl-lib. Come da commenti, è possibile utilizzare delete-dupsal posto di cl-delete-duplicatesse si desidera evitare cl-lib.)


2
+1 Ottima risposta! L'unica informazione che manca è che cl-delete-duplicatesha bisogno di essere messi a disposizione da requireing cl.
giovedì

1
Buona cattura, grazie. Ho modificato la risposta per menzionarla.
Dan

1
Conosci un modo o una funzione che non ti richiede di caricare 'cl-lib?
Luke Shimkus,

3
In realtà sì: risulta delete-dupsche funzionerebbe anche e non richiede 'cl-lib.
Dan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.