จะนับหน้าต่างทั้งหมดในกรอบได้อย่างไร


10

เช่นเดียวกับคำถามที่ระบุไว้ฉันต้องการฟังก์ชั่นที่จะนับจำนวนหน้าต่างที่กำลังแสดงอยู่ในเฟรมนั้น

ดังนั้นนี่คือ:

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

จะกลับมา => 3

ฉันเริ่มฟังก์ชั่นด้านล่าง:

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

2
คุณหมายถึงจำนวนหน้าต่างหรือจำนวนบัฟเฟอร์เฉพาะที่มองเห็นได้ในหน้าต่างหรือไม่
แดน

3
ในตัวอย่างที่ระบุคุณมี 3 windows แสดง 3 บัฟเฟอร์ที่แตกต่างกัน ถ้าบอกว่ามี 2 หน้าต่างที่แสดงอยู่*scratch*คุณต้องการให้ฟังก์ชันคืนค่า 3 หรือ 2 หรือไม่
แดน

@ ด่านขออภัยสำหรับความเข้าใจผิดและฉันต้องการให้ฟังก์ชันคืนค่า 3
Luke Shimkus

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-duplicatesถ้าคุณต้องการหลีกเลี่ยงcl-lib)


2
+1 คำตอบยอดเยี่ยม! ข้อมูลเดียวที่ขาดหายไปคือcl-delete-duplicatesความต้องการที่จะให้บริการโดยไอเอ็นจีrequire cl
itsjeyd

1
ขอบคุณมาก ฉันได้แก้ไขคำตอบเพื่อพูดถึงมัน
แดน

1
คุณรู้วิธีหรือฟังก์ชั่นที่ไม่ต้องการให้คุณโหลด'cl-libหรือไม่?
Luke Shimkus

3
ที่จริงแล้วใช่: มันกลับกลายเป็นว่าdelete-dupsจะใช้งานได้และไม่ต้องการ 'cl-lib
แดน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.