フレーム内のすべてのウィンドウを数える方法は?


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を返すようにします。
ルークシムカス2014年

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


2
+1正解です。欠けている唯一の情報は、ing cl-delete-duplicatesによって利用可能にrequireする必要があることclです。
itsjeyd 2014年

1
良いキャッチ、ありがとう。私はそれを言及するために答えを編集しました。
ダン

1
ロードする必要のない方法または関数を知っています'cl-libか?
ルークシムカス2014年

3
実際には、はい:delete-dupsも機能することがわかり、 'cl-libは必要ありません。
ダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.