From 0ce54e6590ff697e1fb44f5684d0ab3e90160d12 Mon Sep 17 00:00:00 2001 From: Sean Whitton Date: Thu, 21 Mar 2024 15:33:26 +0800 Subject: rewrite spw/maybe-toggle-split-after-resize Now toggles both ways, avoids unnecessary redirection to spw/toggle-frame-split, and restores next and previous windows lists. --- .emacs.d/init.el | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/.emacs.d/init.el b/.emacs.d/init.el index 5ab92cf4..4a0c7daf 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -2,7 +2,7 @@ ;; Except for parts marked as authored by others, this file is ;; -;; Copyright (C) 2010-2023 Sean Whitton +;; Copyright (C) 2010-2024 Sean Whitton ;; ;; and is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -2177,12 +2177,41 @@ Useful after resizing the frame." (defun spw/maybe-toggle-split-after-resize (frame) (when (and (framep frame) (frame-size-changed-p frame) - (< (frame-width frame) split-width-threshold)) + (= (count-windows nil frame) 2)) (with-selected-frame frame - (when (and (= (count-windows) 2) - (/= (car (window-edges (selected-window))) - (car (window-edges (next-window))))) - (spw/toggle-frame-split))))) + (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))))))))) (add-to-list 'window-size-change-functions #'spw/maybe-toggle-split-after-resize) -- cgit v1.2.3