Merge branch 'master' of git.savannah.gnu.org:/srv/git/emacs

This commit is contained in:
Eli Zaretskii 2018-12-08 11:13:28 +02:00
commit 7e9f62c0bc
4 changed files with 101 additions and 12 deletions

View file

@ -2607,6 +2607,12 @@ suitable @code{window-height} or @code{window-width} entry, see above.
If splitting the selected window fails and there is a non-dedicated
window below the selected one showing some other buffer, this function
tries to use that window for showing @var{buffer}.
If @var{alist} contains a @code{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 this is only a
guarantee. In order to actually resize the window used, @var{alist}
must also provide an appropriate @code{window-height} entry.
@end defun
@defun display-buffer-at-bottom buffer alist
@ -2790,6 +2796,22 @@ The value specifies an alist of window parameters to give the chosen
window. All action functions that choose a window should process this
entry.
@vindex window-min-height@r{, a buffer display action alist entry}
@item window-min-height
The value specifies a minimum height of the window used, in lines. If
a window is not or cannot be made as high as specified by this entry,
the window is not considered for use. The only client of this entry
is presently @code{display-buffer-below-selected}.
Note that providing such an entry alone does not necessarily make the
window as tall as specified by its value. To actually resize an
existing window or make a new window as tall as specified by that
value, a @code{window-height} entry specifying that value should be
provided as well. Such a @code{window-height} entry can, however,
specify a completely different value or ask the window height to be
fit to that of its buffer in which case the @code{window-min-height}
entry provides the guaranteed minimum height of the window used.
@vindex window-height@r{, a buffer display action alist entry}
@item window-height
The value specifies whether and how to adjust the height of the chosen

View file

@ -1234,6 +1234,12 @@ of the Emacs Lisp Reference manual for more detail.
A buffer-local value of this hook is now run only if at least one
window showing the buffer has changed its size.
+++
** New buffer display action alist entry 'window-min-height'.
Such an entry allows to specify a minimum height of the window used
for displaying a buffer. 'display-buffer-below-selected' is the only
action function to respect it at the moment.
+++
** The function 'assoc-delete-all' now takes an optional predicate argument.

View file

@ -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."

View file

@ -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