Как посчитать все окна в рамке?

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?
Дан
@ Дан, извините за недоразумение, и я бы еще функцию вернуть 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.
itjeyd
1
Хороший улов, спасибо. Я отредактировал ответ, чтобы упомянуть об этом.
Дан
1
Вы знаете способ или функцию, которая не требует загрузки 'cl-lib?
Люк Шимкус
3
На самом деле, да: оказывается, что delete-dupsэто тоже сработает и не требует cl-lib.
Дан