Як порахувати всі вікна в рамці?


10

Як і в заданому питанні, я хотів би функцію, яка б враховувала вікна, які наразі відображаються в цьому кадрі.

Отже це:

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

Повернеться => 3

Я запустив функцію нижче:

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

2
Ви маєте на увазі кількість вікон або кількість унікальних буферів, видимих ​​у вікнах?
Дан

3
У наведеному прикладі у вас є 3 вікна, де відображаються 3 різних буфера. Якщо, скажімо, 2 з цих вікон показували *scratch*, чи хотіли б ви, щоб функція повертала 3 чи 2?
Дан

@Dan, вибачте за непорозуміння, і я хотів би функцію повернути 3 ще.
Лука Шимкус

1
Зрозумів - відповідь нижче дає обидва варіанти: схоже, ви хочете простішого ( count-windows).
Дан

Відповіді:


21

Якщо ви маєте на увазі кількість вікон незалежно від того, які буфери відображаються, то: (length (window-list))зробимо це. А ще краще, ви можете просто використовувати існуючу (count-windows)функцію.

Якщо ви хочете порахувати кількість унікальних буферів, видимих ​​у вікнах на кадрі, ви можете використовувати:

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

(Зверніть увагу, що window-listви також можете приймати необов'язковий аргумент FRAME, якщо вам потрібно щось інше, ніж обраний кадр.)

Якщо вставити останнє у функціональний дзвінок, ви отримаєте:

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

(Зверніть увагу, що ця функція передбачає завантаження 'cl-lib. Відповідно до коментарів, ви можете використовувати їх delete-dupsзамість, cl-delete-duplicatesякщо хочете уникнути cl-lib.)


2
+1 Відмінна відповідь! Єдина інформація, якої не вистачає, - це те, що cl-delete-duplicatesпотрібно зробити доступною через requireing cl.
itsjeyd

1
Гарний улов, дякую. Я відредагував відповідь, щоб згадати її.
Дан

1
Чи знаєте ви спосіб чи функцію, яка не потребує завантаження 'cl-lib?
Лука Шимкус

3
Насправді, так: виявляється, це delete-dupsтакож спрацювало б і не вимагає 'cl-lib.
Дан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.