Làm thế nào để đếm tất cả các cửa sổ trong một khung?


10

Giống như câu hỏi đã nêu, tôi muốn một chức năng sẽ đếm các cửa sổ hiện đang được hiển thị trong khung đó.

Vậy đây:

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

Sẽ trở lại => 3

Tôi đã bắt đầu một chức năng dưới đây:

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

2
Bạn có nghĩa là số lượng cửa sổ, hoặc số lượng bộ đệm duy nhất có thể nhìn thấy trong các cửa sổ?
Dân

3
Trong ví dụ đã cho, bạn có 3 cửa sổ hiển thị 3 bộ đệm khác nhau. Nếu, giả sử, 2 trong số các cửa sổ đó đang hiển thị *scratch*, bạn có muốn hàm trả về 3 hoặc 2 không?
Dân

@Dan, xin lỗi vì sự hiểu lầm, và tôi sẽ trả lại chức năng 3.
Luke Shimkus

1
Có nó - câu trả lời dưới đây cung cấp cho cả hai tùy chọn: có vẻ như bạn muốn cái đơn giản hơn ( count-windows).
Dan

Câu trả lời:


21

Nếu bạn có nghĩa là số lượng cửa sổ bất kể bộ đệm nào đang hiển thị, thì: (length (window-list))sẽ làm điều đó. Tốt hơn hết, bạn chỉ có thể sử dụng (count-windows)chức năng hiện có .

Nếu bạn muốn đếm số lượng bộ đệm duy nhất hiển thị trong các cửa sổ trên khung, thì bạn có thể sử dụng:

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

(Lưu ý rằng window-listcũng có thể có một đối số FRAME tùy chọn nếu bạn muốn một cái gì đó ngoài khung đã chọn.)

Kết thúc phần sau trong lệnh gọi hàm của bạn sẽ cung cấp cho bạn:

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

(Lưu ý rằng chức năng này giả sử bạn đã tải 'cl-lib. Theo nhận xét, bạn có thể sử dụng delete-dupsthay cho cl-delete-duplicatesnếu bạn muốn tránh cl-lib.)


2
+1 Câu trả lời tuyệt vời! Thông tin duy nhất còn thiếu là cl-delete-duplicatescần phải được cung cấp bằng requireing cl.
itjeyd

1
Bắt tốt, cảm ơn. Tôi đã chỉnh sửa câu trả lời để đề cập đến nó.
Dân

1
Bạn có biết một cách hoặc một chức năng không yêu cầu bạn tải 'cl-libkhông?
Luke Shimkus

3
Trên thực tế, có: hóa ra delete-dupscũng sẽ hoạt động và không yêu cầu 'cl-lib.
Dan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.