Bir çerçevedeki tüm pencereler nasıl sayılır?


10

Sorunun belirttiği gibi, şu anda bu çerçevede gösterilen pencereleri sayan bir işlev istiyorum.

Yani bu:

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

Dönecekti => 3

Aşağıda bir fonksiyon başlattım:

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

2
Windows sayısı mı yoksa pencerelerde görünen benzersiz arabellek sayısı mı demek istediniz?
Dan

3
Verilen örnekte, 3 farklı tamponu gösteren 3 pencereniz var. Diyelim ki, bu pencerelerden 2'si gösteriliyorsa *scratch*, işlevin 3 veya 2 döndürmesini ister misiniz?
Dan

@ Dan, yanlış anlama için özür dilerim ve fonksiyonun 3'ü tekrar döndürmesini isterim.
Luke Shimkus

1
Anladım - aşağıdaki cevap her iki seçeneği de sunuyor: daha basit olanı ( count-windows) istediğiniz gibi görünüyor .
Dan

Yanıtlar:


21

Hangi arabelleklerin gösterildiğine bakılmaksızın pencerelerin sayısını kastediyorsanız : (length (window-list))o zaman bunu yapacaktır. Daha da iyisi, sadece mevcut (count-windows)işlevi kullanabilirsiniz .

Çerçevedeki pencerelerde görünen benzersiz arabellek sayısını saymak istiyorsanız, şunları kullanabilirsiniz:

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

( window-listSeçili çerçeveden başka bir şey istiyorsanız isteğe bağlı bir ÇERÇEVE bağımsız değişkeni alabileceğinizi unutmayın.)

Sonuncuyu işlev çağrınızda sarmanız size şunları verecektir:

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

(Bu işlevin yüklediğinizi varsaydığını unutmayın 'cl-lib. Yorumlara göre, kaçınmak istiyorsanız delete-dupsyerine kullanabilirsiniz .)cl-delete-duplicatescl-lib


2
+1 Harika cevap! Eksik olan tek bilgi ing cl-delete-duplicatestarafından sağlanmalıdır . requirecl
itsjeyd

1
İyi yakaladın, teşekkürler. Cevabı belirtmek için düzenledim.
Dan

1
Yüklemenizi gerektirmeyen bir yol ya da işlev biliyor musunuz 'cl-lib?
Luke Shimkus

3
Aslında evet: Bu delete-dupsda işe yarayacak ve 'cl-lib' gerektirmiyor.
Dan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.