Wie zähle ich alle Fenster in einem Rahmen?

10

Genau wie in der Frage angegeben, möchte ich eine Funktion, die die Fenster zählt, die derzeit in diesem Frame angezeigt werden.

Also das:

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

Würde zurückkehren => 3

Ich habe unten eine Funktion gestartet:

(defun count-windows ()
  "Count how many buffers are currently being shown."
  (interactive)
)
Luke Shimkus
quelle
2
Meinen Sie die Anzahl der Fenster oder die Anzahl der eindeutigen Puffer, die in Fenstern sichtbar sind?
Dan
3
Im angegebenen Beispiel haben Sie 3 Fenster mit 3 verschiedenen Puffern. Wenn beispielsweise 2 dieser Fenster angezeigt werden *scratch*, möchten Sie, dass die Funktion 3 oder 2 zurückgibt?
Dan
@ Dan, sorry für das Missverständnis, und ich würde die Funktion, noch 3 zurückzugeben.
Luke Shimkus
1
Verstanden - die Antwort unten bietet beide Optionen: Es sieht so aus, als ob Sie die einfachere wollen ( count-windows).
Dan

Antworten:

21

Wenn Sie die Anzahl der Fenster meinen, unabhängig davon, welche Puffer angezeigt werden, dann: (length (window-list))wird es tun. Besser noch, Sie können einfach die vorhandene (count-windows)Funktion verwenden.

Wenn Sie die Anzahl der eindeutigen Puffer zählen möchten, die in Fenstern des Rahmens sichtbar sind, können Sie Folgendes verwenden:

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

(Beachten Sie, dass window-listauch ein optionales FRAME-Argument verwendet werden kann, wenn Sie etwas anderes als den ausgewählten Frame möchten.)

Wenn Sie Letzteres in Ihren Funktionsaufruf einschließen, erhalten Sie:

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

(Beachten Sie, dass diese Funktion davon ausgeht, dass Sie geladen haben 'cl-lib. Gemäß den Kommentaren können Sie diese delete-dupsanstelle von verwenden, cl-delete-duplicateswenn Sie dies vermeiden möchten cl-lib.)

Dan
quelle
2
+1 Tolle Antwort! Die einzige Information, die fehlt, ist, dass cl-delete-duplicatessie von requireing zur Verfügung gestellt werden muss cl.
Itsjeyd
1
Guter Fang, danke. Ich habe die Antwort bearbeitet, um sie zu erwähnen.
Dan
1
Kennen Sie einen Weg oder eine Funktion, die Sie nicht laden müssen 'cl-lib?
Luke Shimkus
3
Eigentlich ja: es stellt sich heraus, dass das delete-dupsauch funktionieren würde und 'cl-lib' nicht benötigt.
Dan