Bagaimana cara menghitung semua jendela dalam bingkai?

10

Sama seperti pertanyaan yang dinyatakan, saya ingin fungsi yang akan menghitung jendela yang saat ini ditampilkan dalam bingkai itu.

Jadi ini:

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

Akan kembali => 3

Saya memulai fungsi di bawah ini:

(defun count-windows ()
  "Count how many buffers are currently being shown."
  (interactive)
)
Luke Shimkus
sumber
2
Apakah maksud Anda jumlah jendela, atau jumlah buffer unik yang terlihat di windows?
Dan
3
Dalam contoh yang diberikan, Anda memiliki 3 jendela yang menunjukkan 3 buffer berbeda. Jika, katakanlah, 2 jendela itu ditampilkan *scratch*, apakah Anda ingin fungsi mengembalikan 3 atau 2?
Dan
@Dan, maaf untuk kesalahpahaman, dan saya akan fungsi untuk mengembalikan 3 masih.
Luke Shimkus
1
Mengerti - jawaban di bawah ini memberikan kedua opsi: sepertinya Anda menginginkan yang lebih sederhana ( count-windows).
Dan

Jawaban:

21

Jika Anda bermaksud jumlah jendela terlepas dari buffer yang ditampilkan, maka: (length (window-list))akan melakukannya. Lebih baik lagi, Anda bisa menggunakan (count-windows)fungsi yang ada .

Jika Anda ingin menghitung jumlah buffer unik yang terlihat di jendela pada bingkai, maka Anda dapat menggunakan:

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

(Catatan yang window-listjuga dapat mengambil argumen FRAME opsional jika Anda menginginkan sesuatu selain bingkai yang dipilih.)

Membungkus yang terakhir dalam panggilan fungsi Anda akan memberi Anda:

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

(Perhatikan bahwa fungsi ini mengasumsikan Anda telah memuat 'cl-lib. Sesuai komentar, Anda dapat menggunakannya delete-dupssebagai pengganti cl-delete-duplicatesjika Anda ingin menghindari cl-lib.)

Dan
sumber
2
+1 Jawaban bagus! Satu-satunya info yang hilang adalah bahwa cl-delete-duplicateskebutuhan harus dibuat tersedia oleh requireing cl.
itsjeyd
1
Tangkapan yang bagus, terima kasih. Saya telah mengedit jawaban untuk menyebutkannya.
Dan
1
Apakah Anda tahu cara atau fungsi yang tidak mengharuskan Anda memuat 'cl-lib?
Luke Shimkus
3
Sebenarnya, ya: ternyata delete-dupsitu juga akan berfungsi, dan tidak memerlukan 'cl-lib.
Dan