Bunuh buffer ketika bingkai dihapus


12

Ketika saya menutup sebuah bingkai, saya ingin buffernya terbunuh.

Jika buffer ditampilkan dalam bingkai lain, buffer tidak boleh dimatikan.

Jangan lakukan apa pun jika lebih dari satu buffer ditampilkan dalam bingkai.

Apa cara yang baik untuk mengatur ini?


Semua jawaban tidak bekerja secara individual untuk saya. Namun jika saya mempertahankan ketiganya, itu benar-benar berfungsi.
phonycollectibles

Jawaban:


11

Jika saya mengerti pertanyaannya, inilah fungsi yang melakukan apa yang Anda inginkan:

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

Anda dapat menambahkannya sebagai pengait yang dipanggil setiap kali bingkai ditutup menggunakan:

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

5

Di bawah ini adalah fungsi (diuji, tetapi tidak luas) yang memenuhi persyaratan pertama Anda: itu membunuh buffer saat ini ketika Anda menutup frame KECUALI buffer juga terlihat di frame lain.

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

Saya tidak jelas tentang persyaratan kedua:

  • Dengan lebih dari satu penyangga yang ditampilkan dalam bingkai , apakah maksud Anda bingkai memiliki a) dua atau lebih jendela, dan b) jendela memiliki buffer yang berbeda ditampilkan di dalamnya?
  • Dengan tidak melakukan apa pun , maksud Anda a) menghapus bingkai tetapi tidak membunuh buffer saat ini, atau b) benar-benar tidak melakukan apa-apa sama sekali: jangan menghapus frame atau membunuh buffer saat ini?

Hai Dan. Idenya adalah bahwa jika lebih dari satu buffer ditampilkan dalam sebuah frame, melalui beberapa jendela dalam frame itu, maka tidak ada buffer yang akan terbunuh, tetapi frame tersebut akan tetap dihapus.
dharmatech

Tapi saya bisa melihat perilaku lain bermanfaat. Yaitu, bunuh semua buffer yang ditampilkan, asalkan tidak ditampilkan di bingkai lain.
dharmatech

1

Inilah pendekatan sederhana:

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

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

Ini akan membunuh buffer meskipun terbuka di frame lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.