ฆ่าบัฟเฟอร์เมื่อลบเฟรม


12

เมื่อฉันปิดเฟรมฉันต้องการให้บัฟเฟอร์ของมันถูกฆ่า

หากบัฟเฟอร์แสดงในเฟรมอื่นไม่ควรฆ่าบัฟเฟอร์

ไม่ทำอะไรเลยถ้ามีบัฟเฟอร์มากกว่าหนึ่งแสดงในเฟรม

เป็นวิธีที่ดีในการตั้งค่านี้คืออะไร?


คำตอบทั้งหมดไม่ทำงานสำหรับฉัน อย่างไรก็ตามถ้าฉันเก็บทั้งสามไว้มันใช้งานได้จริง
phonycollectibles

คำตอบ:


11

หากฉันเข้าใจคำถามนี่คือฟังก์ชันที่คุณต้องการ:

(defun maybe-delete-frame-buffer (frame)
  "When a dedicated FRAME is deleted, also kill its buffer.
A dedicated frame contains a single window whose buffer is not
displayed anywhere else."
  (let ((windows (window-list frame)))
    (when (eq 1 (length windows))
      (let ((buffer (window-buffer (car windows))))
        (when (eq 1 (length (get-buffer-window-list buffer nil t)))
          (kill-buffer buffer))))))

คุณสามารถเพิ่มเป็นตะขอที่ถูกเรียกเมื่อใดก็ตามที่เฟรมถูกปิดโดยใช้:

(add-to-list 'delete-frame-functions #'maybe-delete-frame-buffer)

5

ด้านล่างนี้เป็นฟังก์ชั่น (ทดสอบ แต่ไม่ครอบคลุม) ที่ตรงกับความต้องการแรกของคุณ: มันฆ่าบัฟเฟอร์ปัจจุบันเมื่อคุณปิดเฟรมจนกว่าคุณจะเห็นบัฟเฟอร์ในเฟรมอื่น

(defun kill-buffer-when-frame-delete-dwim (frame)
  "Kill current buffer unless it's visible in another frame
besides current FRAME."
  (unless (delq nil (mapcar #'(lambda (x)
                                (memq (current-buffer)
                                      (mapcar #'window-buffer x)))
                            (mapcar #'window-list
                                    (delq frame (frame-list)))))
    (kill-buffer (current-buffer))))

(add-hook 'delete-frame-functions 'kill-buffer-when-frame-delete-dwim)

ฉันไม่ชัดเจนในข้อกำหนดที่สอง:

  • โดยมากกว่าหนึ่งบัฟเฟอร์ที่แสดงในเฟรมคุณหมายถึงเฟรมมี) หน้าต่างสองหน้าต่างหรือมากกว่าและ b) หน้าต่างมีบัฟเฟอร์ที่แตกต่างกันแสดงอยู่หรือไม่
  • โดยไม่มีอะไรทำไม่คุณหมายถึง) ลบกรอบ แต่ไม่ได้ฆ่าบัฟเฟอร์ปัจจุบันหรือข) จริงๆทำอะไรเลย: ไม่ต้องลบกรอบหรือฆ่าบัฟเฟอร์ปัจจุบันหรือไม่?

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

แต่ฉันสามารถเห็นพฤติกรรมอื่น ๆ ที่เป็นประโยชน์ คือฆ่าบัฟเฟอร์ทั้งหมดที่แสดงตราบใดที่ไม่ปรากฏในเฟรมอื่น
dharmatech

1

นี่เป็นวิธีง่ายๆ:

(defun close-frame-buffer (frame)
  (kill-buffer
    (window-buffer
      (frame-root-window frame))))

(add-hook 'delete-frame-functions 'close-frame-buffer)

มันจะฆ่าบัฟเฟอร์แม้ว่ามันจะเปิดในเฟรมอื่น

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