जब फ्रेम हटा दिया जाता है तो बफर को मारें


12

जब मैं एक फ्रेम बंद करता हूं, तो मैं चाहता हूं कि इसके बफर को मार दिया जाए।

यदि बफर को अन्य फ़्रेमों में प्रदर्शित किया जाता है, तो बफर को नहीं मारना चाहिए।

एक फ्रेम में एक से अधिक बफर प्रदर्शित होने पर कुछ भी न करें।

इसे स्थापित करने का एक अच्छा तरीका क्या है?


मेरे लिए सभी उत्तर व्यक्तिगत रूप से काम नहीं करते हैं। हालाँकि अगर मैं इन तीनों को रखता हूँ, तो यह वास्तव में काम करता है।
फोनीकोलेक्टिबल्स

जवाबों:


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)

मैं दूसरी आवश्यकता पर अस्पष्ट हूँ:

  • द्वारा एक से अधिक बफर फ्रेम में दिखाया गया है , तो आप क्या मतलब है फ्रेम क) दो या अधिक खिड़कियां हैं, और ख) विंडोज़ अलग बफ़र्स उन्हें में दिखाया गया है?
  • तक कुछ न करें , आप एक मतलब है) फ्रेम हटा देते हैं लेकिन करते नहीं वर्तमान बफर, मारने या ख) वास्तव में सब पर कुछ भी नहीं: फ्रेम हटा सकते हैं या मौजूदा बफर मत मारो?

हाय दान। विचार यह है कि यदि एक फ्रेम में एक से अधिक बफर दिखाए गए हैं, तो उस फ्रेम में कई विंडो के माध्यम से, तो कोई भी बफर नहीं मारा जाएगा, लेकिन फ्रेम अभी भी हटा दिया जाएगा।
धर्मटेक

लेकिन मैं अन्य व्यवहारों को उपयोगी होते देख सकता था। यानी दिखाए गए सभी बफ़र्स को मार दें, जब तक कि उन्हें अन्य फ़्रेमों में नहीं दिखाया जाता है।
धर्मटेक

1

यहाँ एक सरल तरीका है:

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

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

हालाँकि यह किसी अन्य फ्रेम में खुला होने पर भी बफर को मार देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.