Убийте буфер при видаленні кадру


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)

Мені незрозуміло щодо другої вимоги:

  • Маючи на увазі, що в кадрі відображається більше одного буфера , ви маєте на увазі, що кадр має: a) два чи більше вікон; і 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)

Це знищить буфер, навіть якщо він відкритий в іншому кадрі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.