summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2018-12-08 11:13:28 +0200
committerEli Zaretskii <eliz@gnu.org>2018-12-08 11:13:28 +0200
commit7e9f62c0bc3b4f3d47deb5917c90ea449a19460b (patch)
treefc27590741577b5ee8e282f7796ac7d81d07e553 /lisp
parent2877471fefc21d157462d766afbcf3b2c47c4ee8 (diff)
parentd2b3a37886d97abdc10e16f6389200e8ad45dd7a (diff)
downloademacs-7e9f62c0bc3b4f3d47deb5917c90ea449a19460b.tar.gz
Merge branch 'master' of git.savannah.gnu.org:/srv/git/emacs
Diffstat (limited to 'lisp')
-rw-r--r--lisp/dired.el44
-rw-r--r--lisp/window.el41
2 files changed, 73 insertions, 12 deletions
diff --git a/lisp/dired.el b/lisp/dired.el
index cbd85fed91c..e5dc8623a49 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -1478,12 +1478,36 @@ change; the point does."
(list w
(dired-get-filename nil t)
(line-number-at-pos (window-point w)))))
- (get-buffer-window-list nil 0 t))))
+ (get-buffer-window-list nil 0 t))
+ ;; For each window that showed the current buffer before, scan its
+ ;; list of previous buffers. For each association thus found save
+ ;; a triple <point, name, line> where 'point' is that window's
+ ;; window-point marker stored in the window's list of previous
+ ;; buffers, 'name' is the filename at the position of 'point' and
+ ;; 'line' is the line number at the position of 'point'.
+ (let ((buffer (current-buffer))
+ prevs)
+ (walk-windows
+ (lambda (window)
+ (let ((prev (assq buffer (window-prev-buffers window))))
+ (when prev
+ (with-current-buffer buffer
+ (save-excursion
+ (goto-char (nth 2 prev))
+ (setq prevs
+ (cons
+ (list (nth 2 prev)
+ (dired-get-filename nil t)
+ (line-number-at-pos (point)))
+ prevs)))))))
+ 'nomini t)
+ prevs)))
(defun dired-restore-positions (positions)
"Restore POSITIONS saved with `dired-save-positions'."
(let* ((buf-file-pos (nth 0 positions))
- (buffer (nth 0 buf-file-pos)))
+ (buffer (nth 0 buf-file-pos))
+ (prevs (nth 2 positions)))
(unless (and (nth 1 buf-file-pos)
(dired-goto-file (nth 1 buf-file-pos)))
(goto-char (point-min))
@@ -1497,7 +1521,21 @@ change; the point does."
(dired-goto-file (nth 1 win-file-pos)))
(goto-char (point-min))
(forward-line (1- (nth 2 win-file-pos)))
- (dired-move-to-filename)))))))
+ (dired-move-to-filename)))))
+ (when prevs
+ (with-current-buffer buffer
+ (save-excursion
+ (dolist (prev prevs)
+ (let ((point (nth 0 prev)))
+ ;; Sanity check of the point marker.
+ (when (and (markerp point)
+ (eq (marker-buffer point) buffer))
+ (unless (and (nth 0 prev)
+ (dired-goto-file (nth 1 prev)))
+ (goto-char (point-min))
+ (forward-line (1- (nth 2 prev))))
+ (dired-move-to-filename)
+ (move-marker point (point) buffer)))))))))
(defun dired-remember-marks (beg end)
"Return alist of files and their marks, from BEG to END."
diff --git a/lisp/window.el b/lisp/window.el
index a16ceb4eb99..25a599f91d2 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -7465,22 +7465,45 @@ If there is a window below the selected one and that window
already displays BUFFER, use that window. Otherwise, try to
create a new window below the selected one and show BUFFER there.
If that attempt fails as well and there is a non-dedicated window
-below the selected one, use that window."
- (let (window)
+below the selected one, use that window.
+
+If ALIST contains a 'window-min-height' entry, this function
+ensures that the window used is or can become at least as high as
+specified by that entry's value. Note that such an entry alone
+will not resize the window per se. In order to do that, ALIST
+must also contain a 'window-height' entry with the same value."
+ (let ((min-height (cdr (assq 'window-min-height alist)))
+ window)
(or (and (setq window (window-in-direction 'below))
- (eq buffer (window-buffer window))
+ (eq buffer (window-buffer window))
+ (or (not (numberp min-height))
+ (>= (window-height window) min-height)
+ ;; 'window--display-buffer' can resize this window if
+ ;; and only if it has a 'quit-restore' parameter
+ ;; certifying that it always showed BUFFER before.
+ (let ((height (window-height window))
+ (quit-restore (window-parameter window 'quit-restore)))
+ (and quit-restore
+ (eq (nth 1 quit-restore) 'window)
+ (window-resizable-p window (- min-height height)))))
(window--display-buffer buffer window 'reuse alist))
(and (not (frame-parameter nil 'unsplittable))
- (let ((split-height-threshold 0)
+ (or (not (numberp min-height))
+ (window-sizable-p nil (- min-height)))
+ (let ((split-height-threshold 0)
split-width-threshold)
- (setq window (window--try-to-split-window
+ (setq window (window--try-to-split-window
(selected-window) alist)))
- (window--display-buffer
- buffer window 'window alist display-buffer-mark-dedicated))
+ (window--display-buffer
+ buffer window 'window alist display-buffer-mark-dedicated))
(and (setq window (window-in-direction 'below))
- (not (window-dedicated-p window))
+ (not (window-dedicated-p window))
+ (or (not (numberp min-height))
+ ;; A window that showed another buffer before cannot
+ ;; be resized.
+ (>= (window-height window) min-height))
(window--display-buffer
- buffer window 'reuse alist display-buffer-mark-dedicated)))))
+ buffer window 'reuse alist display-buffer-mark-dedicated)))))
(defun display-buffer--maybe-at-bottom (buffer alist)
(let ((alist (append alist `(,(if temp-buffer-resize-mode