Çerçeve silindiğinde arabelleği öldür


12

Bir çerçeveyi kapattığımda, tamponunun öldürülmesini istiyorum.

Tampon başka çerçevelerde görüntüleniyorsa, tampon öldürülmemelidir.

Bir çerçevede birden fazla arabellek görüntüleniyorsa hiçbir şey yapmayın.

Bunu ayarlamanın iyi bir yolu nedir?


Bütün cevaplar benim için bireysel olarak çalışmıyor. Ancak üçünü de tutarsam, aslında işe yarıyor.
phonycollectibles

Yanıtlar:


11

Soruyu anladım, işte istediğini yapan bir işlev:

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

Bir çerçeve kapatıldığında çağrılan kanca olarak ekleyebilirsiniz:

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

5

Aşağıda, ilk gereksiniminizi karşılayan bir işlev (test edilmiş, ancak kapsamlı bir şekilde değil) bulunmaktadır: Bir çerçeveyi kapattığınızda , arabelleğin başka bir çerçevede de görünmesi AÇIK OLMADAN , geçerli arabelleği öldürür .

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

İkinci şarttan emin değilim:

  • By birden fazla tampon çerçevede görüntülenen , sen çerçeve a) İki veya daha fazla pencere vardır demek, ve b) pencereleri farklı tamponlar kendilerine görüntülenmesini?
  • By do şey , siz) bir ortalama çerçeveyi silmek ama yapmalıyım değil şimdiki tamponu, öldürmek veya b) gerçekten hiç bir şey yapın: çerçeveyi silmek veya geçerli tampon öldürmüyorsunuz?

Merhaba Dan. Fikir, bir çerçevede birden fazla arabellek gösteriliyorsa, bu çerçevedeki birden çok pencere aracılığıyla, arabellek öldürülmeyecek, ancak çerçeve yine de silinecektir.
dharmatech

Ancak diğer davranışların da yararlı olduğunu görebiliyordum. Diğer çerçevelerde gösterilmediği sürece gösterilen tüm tamponları öldürürüm.
dharmatech

1

İşte basit bir yaklaşım:

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

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

Ancak başka bir çerçevede açık olsa bile bir tamponu öldürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.