Jak policzyć wszystkie okna w ramce?

10

Tak jak zadane pytanie, chciałbym funkcji, która zliczałaby okna wyświetlane obecnie w tej ramce.

Więc to:

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

Wróciłbym => 3

Uruchomiłem funkcję poniżej:

(defun count-windows ()
  "Count how many buffers are currently being shown."
  (interactive)
)
Luke Shimkus
źródło
2
Czy masz na myśli liczbę okien, czy liczbę unikalnych buforów widocznych w oknach?
Dan
3
W podanym przykładzie masz 3 okna pokazujące 3 różne bufory. Jeśli powiedzmy, że 2 z tych okien były wyświetlane *scratch*, czy chcesz, aby funkcja zwróciła 3 lub 2?
Dan
@ Dan, przepraszam za nieporozumienie i chciałbym, aby funkcja zwróciła jeszcze 3.
Luke Shimkus
1
Rozumiem - odpowiedź poniżej podaje obie opcje: wygląda na to, że chcesz mieć prostszą ( count-windows).
Dan

Odpowiedzi:

21

Jeśli masz na myśli liczbę okien niezależnie od tego, które bufory są wyświetlane, to: (length (window-list))zrobi to. Co więcej, możesz po prostu użyć istniejącej (count-windows)funkcji.

Jeśli chcesz policzyć liczbę unikalnych buforów widocznych w oknach na ramce, możesz użyć:

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

(Pamiętaj, że window-listmożesz również wziąć opcjonalny argument FRAME, jeśli chcesz czegoś innego niż wybrana ramka).

Opakowanie tego ostatniego w wywołanie funkcji zapewni:

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

(Pamiętaj, że ta funkcja zakłada, że ​​załadowałeś 'cl-lib. Zgodnie z komentarzami możesz użyć delete-dupszamiast tego, cl-delete-duplicatesjeśli chcesz tego uniknąć cl-lib).

Dan
źródło
2
+1 Świetna odpowiedź! Brakuje tylko informacji, które cl-delete-duplicatesnależy udostępnić przez requireing cl.
itsjeyd
1
Dobry chwyt, dzięki. Zredagowałem odpowiedź, aby o niej wspomnieć.
Dan
1
Czy znasz sposób lub funkcję, która nie wymaga ładowania 'cl-lib?
Luke Shimkus
3
Właściwie tak: okazuje się, że delete-dupsto też działałoby i nie wymaga 'cl-lib.
Dan