diff options
| author | Eli Zaretskii | 2018-12-08 11:13:28 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2018-12-08 11:13:28 +0200 |
| commit | 7e9f62c0bc3b4f3d47deb5917c90ea449a19460b (patch) | |
| tree | fc27590741577b5ee8e282f7796ac7d81d07e553 /lisp | |
| parent | 2877471fefc21d157462d766afbcf3b2c47c4ee8 (diff) | |
| parent | d2b3a37886d97abdc10e16f6389200e8ad45dd7a (diff) | |
| download | emacs-7e9f62c0bc3b4f3d47deb5917c90ea449a19460b.tar.gz emacs-7e9f62c0bc3b4f3d47deb5917c90ea449a19460b.zip | |
Merge branch 'master' of git.savannah.gnu.org:/srv/git/emacs
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/dired.el | 44 | ||||
| -rw-r--r-- | lisp/window.el | 41 |
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." | |||
| 1478 | (list w | 1478 | (list w |
| 1479 | (dired-get-filename nil t) | 1479 | (dired-get-filename nil t) |
| 1480 | (line-number-at-pos (window-point w))))) | 1480 | (line-number-at-pos (window-point w))))) |
| 1481 | (get-buffer-window-list nil 0 t)))) | 1481 | (get-buffer-window-list nil 0 t)) |
| 1482 | ;; For each window that showed the current buffer before, scan its | ||
| 1483 | ;; list of previous buffers. For each association thus found save | ||
| 1484 | ;; a triple <point, name, line> where 'point' is that window's | ||
| 1485 | ;; window-point marker stored in the window's list of previous | ||
| 1486 | ;; buffers, 'name' is the filename at the position of 'point' and | ||
| 1487 | ;; 'line' is the line number at the position of 'point'. | ||
| 1488 | (let ((buffer (current-buffer)) | ||
| 1489 | prevs) | ||
| 1490 | (walk-windows | ||
| 1491 | (lambda (window) | ||
| 1492 | (let ((prev (assq buffer (window-prev-buffers window)))) | ||
| 1493 | (when prev | ||
| 1494 | (with-current-buffer buffer | ||
| 1495 | (save-excursion | ||
| 1496 | (goto-char (nth 2 prev)) | ||
| 1497 | (setq prevs | ||
| 1498 | (cons | ||
| 1499 | (list (nth 2 prev) | ||
| 1500 | (dired-get-filename nil t) | ||
| 1501 | (line-number-at-pos (point))) | ||
| 1502 | prevs))))))) | ||
| 1503 | 'nomini t) | ||
| 1504 | prevs))) | ||
| 1482 | 1505 | ||
| 1483 | (defun dired-restore-positions (positions) | 1506 | (defun dired-restore-positions (positions) |
| 1484 | "Restore POSITIONS saved with `dired-save-positions'." | 1507 | "Restore POSITIONS saved with `dired-save-positions'." |
| 1485 | (let* ((buf-file-pos (nth 0 positions)) | 1508 | (let* ((buf-file-pos (nth 0 positions)) |
| 1486 | (buffer (nth 0 buf-file-pos))) | 1509 | (buffer (nth 0 buf-file-pos)) |
| 1510 | (prevs (nth 2 positions))) | ||
| 1487 | (unless (and (nth 1 buf-file-pos) | 1511 | (unless (and (nth 1 buf-file-pos) |
| 1488 | (dired-goto-file (nth 1 buf-file-pos))) | 1512 | (dired-goto-file (nth 1 buf-file-pos))) |
| 1489 | (goto-char (point-min)) | 1513 | (goto-char (point-min)) |
| @@ -1497,7 +1521,21 @@ change; the point does." | |||
| 1497 | (dired-goto-file (nth 1 win-file-pos))) | 1521 | (dired-goto-file (nth 1 win-file-pos))) |
| 1498 | (goto-char (point-min)) | 1522 | (goto-char (point-min)) |
| 1499 | (forward-line (1- (nth 2 win-file-pos))) | 1523 | (forward-line (1- (nth 2 win-file-pos))) |
| 1500 | (dired-move-to-filename))))))) | 1524 | (dired-move-to-filename))))) |
| 1525 | (when prevs | ||
| 1526 | (with-current-buffer buffer | ||
| 1527 | (save-excursion | ||
| 1528 | (dolist (prev prevs) | ||
| 1529 | (let ((point (nth 0 prev))) | ||
| 1530 | ;; Sanity check of the point marker. | ||
| 1531 | (when (and (markerp point) | ||
| 1532 | (eq (marker-buffer point) buffer)) | ||
| 1533 | (unless (and (nth 0 prev) | ||
| 1534 | (dired-goto-file (nth 1 prev))) | ||
| 1535 | (goto-char (point-min)) | ||
| 1536 | (forward-line (1- (nth 2 prev)))) | ||
| 1537 | (dired-move-to-filename) | ||
| 1538 | (move-marker point (point) buffer))))))))) | ||
| 1501 | 1539 | ||
| 1502 | (defun dired-remember-marks (beg end) | 1540 | (defun dired-remember-marks (beg end) |
| 1503 | "Return alist of files and their marks, from BEG to END." | 1541 | "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 | |||
| 7465 | already displays BUFFER, use that window. Otherwise, try to | 7465 | already displays BUFFER, use that window. Otherwise, try to |
| 7466 | create a new window below the selected one and show BUFFER there. | 7466 | create a new window below the selected one and show BUFFER there. |
| 7467 | If that attempt fails as well and there is a non-dedicated window | 7467 | If that attempt fails as well and there is a non-dedicated window |
| 7468 | below the selected one, use that window." | 7468 | below the selected one, use that window. |
| 7469 | (let (window) | 7469 | |
| 7470 | If ALIST contains a 'window-min-height' entry, this function | ||
| 7471 | ensures that the window used is or can become at least as high as | ||
| 7472 | specified by that entry's value. Note that such an entry alone | ||
| 7473 | will not resize the window per se. In order to do that, ALIST | ||
| 7474 | must also contain a 'window-height' entry with the same value." | ||
| 7475 | (let ((min-height (cdr (assq 'window-min-height alist))) | ||
| 7476 | window) | ||
| 7470 | (or (and (setq window (window-in-direction 'below)) | 7477 | (or (and (setq window (window-in-direction 'below)) |
| 7471 | (eq buffer (window-buffer window)) | 7478 | (eq buffer (window-buffer window)) |
| 7479 | (or (not (numberp min-height)) | ||
| 7480 | (>= (window-height window) min-height) | ||
| 7481 | ;; 'window--display-buffer' can resize this window if | ||
| 7482 | ;; and only if it has a 'quit-restore' parameter | ||
| 7483 | ;; certifying that it always showed BUFFER before. | ||
| 7484 | (let ((height (window-height window)) | ||
| 7485 | (quit-restore (window-parameter window 'quit-restore))) | ||
| 7486 | (and quit-restore | ||
| 7487 | (eq (nth 1 quit-restore) 'window) | ||
| 7488 | (window-resizable-p window (- min-height height))))) | ||
| 7472 | (window--display-buffer buffer window 'reuse alist)) | 7489 | (window--display-buffer buffer window 'reuse alist)) |
| 7473 | (and (not (frame-parameter nil 'unsplittable)) | 7490 | (and (not (frame-parameter nil 'unsplittable)) |
| 7474 | (let ((split-height-threshold 0) | 7491 | (or (not (numberp min-height)) |
| 7492 | (window-sizable-p nil (- min-height))) | ||
| 7493 | (let ((split-height-threshold 0) | ||
| 7475 | split-width-threshold) | 7494 | split-width-threshold) |
| 7476 | (setq window (window--try-to-split-window | 7495 | (setq window (window--try-to-split-window |
| 7477 | (selected-window) alist))) | 7496 | (selected-window) alist))) |
| 7478 | (window--display-buffer | 7497 | (window--display-buffer |
| 7479 | buffer window 'window alist display-buffer-mark-dedicated)) | 7498 | buffer window 'window alist display-buffer-mark-dedicated)) |
| 7480 | (and (setq window (window-in-direction 'below)) | 7499 | (and (setq window (window-in-direction 'below)) |
| 7481 | (not (window-dedicated-p window)) | 7500 | (not (window-dedicated-p window)) |
| 7501 | (or (not (numberp min-height)) | ||
| 7502 | ;; A window that showed another buffer before cannot | ||
| 7503 | ;; be resized. | ||
| 7504 | (>= (window-height window) min-height)) | ||
| 7482 | (window--display-buffer | 7505 | (window--display-buffer |
| 7483 | buffer window 'reuse alist display-buffer-mark-dedicated))))) | 7506 | buffer window 'reuse alist display-buffer-mark-dedicated))))) |
| 7484 | 7507 | ||
| 7485 | (defun display-buffer--maybe-at-bottom (buffer alist) | 7508 | (defun display-buffer--maybe-at-bottom (buffer alist) |
| 7486 | (let ((alist (append alist `(,(if temp-buffer-resize-mode | 7509 | (let ((alist (append alist `(,(if temp-buffer-resize-mode |