In split-window-below fix handling of split-window-keep-point (Bug#10971).

* window.el (split-window-below): Fix bug in case where
split-window-keep-point is nil (Bug#10971).
This commit is contained in:
Martin Rudalics 2012-03-11 14:30:30 +01:00
parent 2b84f674cc
commit c491fa4190
2 changed files with 27 additions and 17 deletions

View file

@ -1,3 +1,8 @@
2012-03-11 Martin Rudalics <rudalics@gmx.at>
* window.el (split-window-below): Fix bug in case where
split-window-keep-point is nil (Bug#10971).
2012-03-11 Juri Linkov <juri@jurta.org>
* replace.el (replace-highlight): Set isearch-word to nil

View file

@ -3273,7 +3273,7 @@ Otherwise, the window starts are chosen so as to minimize the
amount of redisplay; this is convenient on slow terminals."
(interactive "P")
(let ((old-window (selected-window))
(old-point (point))
(old-point (window-point-1))
(size (and size (prefix-numeric-value size)))
moved-by-window-height moved new-window bottom)
(when (and size (< size 0) (< (- size) window-min-height))
@ -3282,22 +3282,27 @@ amount of redisplay; this is convenient on slow terminals."
(setq new-window (split-window nil size))
(unless split-window-keep-point
(with-current-buffer (window-buffer)
(goto-char (window-start))
(setq moved (vertical-motion (window-height)))
(set-window-start new-window (point))
(when (> (point) (window-point new-window))
(set-window-point new-window (point)))
(when (= moved (window-height))
(setq moved-by-window-height t)
(vertical-motion -1))
(setq bottom (point)))
(and moved-by-window-height
(<= bottom (point))
(set-window-point old-window (1- bottom)))
(and moved-by-window-height
(<= (window-start new-window) old-point)
(set-window-point new-window old-point)
(select-window new-window)))
;; Use `save-excursion' around vertical movements below
;; (Bug#10971). Note: When the selected window's buffer has a
;; header line, up to two lines of the buffer may not show up
;; in the resulting configuration.
(save-excursion
(goto-char (window-start))
(setq moved (vertical-motion (window-height)))
(set-window-start new-window (point))
(when (> (point) (window-point new-window))
(set-window-point new-window (point)))
(when (= moved (window-height))
(setq moved-by-window-height t)
(vertical-motion -1))
(setq bottom (point)))
(and moved-by-window-height
(<= bottom (point))
(set-window-point-1 old-window (1- bottom)))
(and moved-by-window-height
(<= (window-start new-window) old-point)
(set-window-point new-window old-point)
(select-window new-window))))
;; Always copy quit-restore parameter in interactive use.
(let ((quit-restore (window-parameter old-window 'quit-restore)))
(when quit-restore