diff --git a/lisp/window.el b/lisp/window.el index f27631bb86..e2029406c7 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -4177,7 +4177,7 @@ window--before-delete-windows (push (list buf start-m pos-m) prev-buf) (set-window-prev-buffers win prev-buf))))))) -(defun delete-window (&optional window) +(defun delete-window (&optional window keep-pos) "Delete WINDOW. WINDOW must be a valid window and defaults to the selected one. Return nil. @@ -4194,13 +4194,16 @@ delete-window argument. Signal an error if WINDOW is either the only window on its frame, the last non-side window, or part of an atomic window that is its frame's root window." - (interactive) + (interactive (list nil t)) (when switch-to-buffer-preserve-window-point (window--before-delete-windows)) + (setq keep-pos (and keep-pos (not window) (window-absolute-pixel-position))) (setq window (window-normalize-window window)) (let* ((frame (window-frame window)) (function (window-parameter window 'delete-window)) (parent (window-parent window)) + (keep-pos-x (when keep-pos (/ (car keep-pos) (frame-char-width)))) + (keep-pos-y (when keep-pos (/ (cdr keep-pos) (frame-char-height)))) atom-root) (window--check frame) (catch 'done @@ -4259,6 +4262,8 @@ delete-window ;; `delete-window-internal' has selected a window that should ;; not be selected, fix this here. (other-window -1 frame)) + (when (and keep-pos-x keep-pos-y (window-at keep-pos-x keep-pos-y)) + (select-window (window-at keep-pos-x keep-pos-y))) (window--check frame) ;; Always return nil. nil))))