如何计算框架中的所有窗户?


10

正如问题所指出的,我想要一个函数,该函数可以计算该框架中当前正在显示的窗口。

所以这:

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

会回来 => 3

我在下面启动了一个功能:

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

2
您是指窗口数,还是窗口中可见的唯一缓冲区数?

3
在给定的示例中,您有3个窗口,其中显示3个不同的缓冲区。例如,如果其中两个窗口正在显示*scratch*,您是否希望函数返回3或2?

@Dan,对于您的误解感到抱歉,我希望函数仍返回3。
Luke Shimkus 2014年

1
知道了-以下答案提供了两种选择:您似乎想要更简单的一个(count-windows)。

Answers:


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-duplicatescl-lib


2
+1好答案!唯一缺少的信息是cl-delete-duplicates需要通过requireing 使其可用cl
itsjeyd 2014年

1
好的收获,谢谢。我已经编辑了答案以提及它。

1
您知道不需要加载的方式或功能'cl-lib吗?
Luke Shimkus 2014年

3
实际上,是的:事实证明该delete-dups方法也可以使用,并且不需要'cl-lib。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.