From 387f0ea016747eb41203c20ec8a109fd23c6e123 Mon Sep 17 00:00:00 2001 From: Sean Whitton Date: Sat, 30 Mar 2024 21:51:44 +0800 Subject: exclude Gnus summary & article splits from toggling --- .emacs.d/init.el | 70 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/.emacs.d/init.el b/.emacs.d/init.el index 4a0c7daf..15ecc557 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -2179,39 +2179,43 @@ Useful after resizing the frame." (frame-size-changed-p frame) (= (count-windows nil frame) 2)) (with-selected-frame frame - (let ((width (frame-width)) - (this-edges (window-edges (selected-window))) - (next-edges (window-edges (next-window)))) - (when (or (and (< width split-width-threshold) - (/= (car this-edges) (car next-edges))) - (and (>= width split-width-threshold) - (/= (cadr this-edges) (cadr next-edges)))) - (cl-flet ((window-info (window) - (cons (window-buffer window) - (cons (window-prev-buffers window) - (window-next-buffers window)))) - (set-window-info (window info) - (set-window-buffer window (car info)) - (set-window-prev-buffers window (cadr info)) - (set-window-next-buffers window (cddr info)))) - (let ((this-info (window-info (selected-window))) - (next-info (window-info (next-window)))) - ;; Ensure we start with a fresh window. - (split-window) - (other-window 1) - (delete-other-windows) - - (if (and (<= (car this-edges) (car next-edges)) - (<= (cadr this-edges) (cadr next-edges))) - ;; Want to use `pop-to-buffer' for the second window s.t. my - ;; rule for REPLs in `display-buffer-alist' takes effect. - (progn (set-window-info (selected-window) this-info) - (save-selected-window - (pop-to-buffer (car next-info)) - (set-window-info (selected-window) next-info))) - (set-window-info (selected-window) next-info) - (pop-to-buffer (car this-info)) - (set-window-info (selected-window) this-info))))))))) + (cl-labels ((toggleable-window-p (window) + (with-current-buffer (window-buffer window) + (not (derived-mode-p 'gnus-summary-mode)))) + (window-info (window) + (and (toggleable-window-p window) + (cons (window-buffer window) + (cons (window-prev-buffers window) + (window-next-buffers window))))) + (set-window-info (window info) + (set-window-buffer window (car info)) + (set-window-prev-buffers window (cadr info)) + (set-window-next-buffers window (cddr info)))) + (when-let* ((this-info (window-info (selected-window))) + (next-info (window-info (next-window))) + (width (frame-width)) + (this-edges (window-edges (selected-window))) + (next-edges (window-edges (next-window)))) + (when (or (and (< width split-width-threshold) + (/= (car this-edges) (car next-edges))) + (and (>= width split-width-threshold) + (/= (cadr this-edges) (cadr next-edges)))) + ;; Ensure we start with a fresh window. + (split-window) + (other-window 1) + (delete-other-windows) + + (if (and (<= (car this-edges) (car next-edges)) + (<= (cadr this-edges) (cadr next-edges))) + ;; Want to use `pop-to-buffer' for the second window s.t. my + ;; rule for REPLs in `display-buffer-alist' takes effect. + (progn (set-window-info (selected-window) this-info) + (save-selected-window + (pop-to-buffer (car next-info)) + (set-window-info (selected-window) next-info))) + (set-window-info (selected-window) next-info) + (pop-to-buffer (car this-info)) + (set-window-info (selected-window) this-info)))))))) (add-to-list 'window-size-change-functions #'spw/maybe-toggle-split-after-resize) -- cgit v1.2.3