From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Tino Calancha Newsgroups: gmane.emacs.bugs Subject: bug#23621: PATCH (25.1.50; Buffer in >1 window; winner-undo recover window point) Date: Fri, 27 May 2016 01:40:47 +0900 (JST) Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset=US-ASCII X-Trace: ger.gmane.org 1464281404 8927 80.91.229.3 (26 May 2016 16:50:04 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 26 May 2016 16:50:04 +0000 (UTC) Cc: Tino Calancha To: 23621@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu May 26 18:49:57 2016 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1b5yTt-0005IL-3P for geb-bug-gnu-emacs@m.gmane.org; Thu, 26 May 2016 18:49:57 +0200 Original-Received: from localhost ([::1]:39552 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b5yTs-0002z7-BE for geb-bug-gnu-emacs@m.gmane.org; Thu, 26 May 2016 12:49:56 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:58933) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b5yIQ-0008EP-HF for bug-gnu-emacs@gnu.org; Thu, 26 May 2016 12:38:07 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b5yIM-0004Ea-Ba for bug-gnu-emacs@gnu.org; Thu, 26 May 2016 12:38:05 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:56653) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b5yIM-0004EV-8C for bug-gnu-emacs@gnu.org; Thu, 26 May 2016 12:38:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1b5yIM-00075A-41 for bug-gnu-emacs@gnu.org; Thu, 26 May 2016 12:38:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Tino Calancha Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 26 May 2016 16:38:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 23621 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 23621-submit@debbugs.gnu.org id=B23621.146428065927165 (code B ref 23621); Thu, 26 May 2016 16:38:02 +0000 Original-Received: (at 23621) by debbugs.gnu.org; 26 May 2016 16:37:39 +0000 Original-Received: from localhost ([127.0.0.1]:40753 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1b5yHy-000745-TI for submit@debbugs.gnu.org; Thu, 26 May 2016 12:37:39 -0400 Original-Received: from calancha-ilc.kek.jp ([130.87.234.234]:49063) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1b5yHw-00073p-C8 for 23621@debbugs.gnu.org; Thu, 26 May 2016 12:37:37 -0400 Original-Received: by calancha-ilc.kek.jp (Postfix, from userid 500) id 01936726B; Fri, 27 May 2016 01:40:47 +0900 (JST) Original-Received: from localhost (localhost [127.0.0.1]) by calancha-ilc.kek.jp (Postfix) with ESMTP id DF944549A; Fri, 27 May 2016 01:40:47 +0900 (JST) X-X-Sender: calancha@calancha-ilc.kek.jp In-Reply-To: User-Agent: Alpine 2.20 (LRH 67 2015-01-07) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:118711 Archived-At: Allow users editing same buffer in diferent windows to restore the window point with `winner-undo'. This report is related with Bug#4041: the behaviour of `winner-undo' just change if an user has set the option `switch-to-buffer-preserve-window-point' non-nil. Following patch restore the buffer point from deleted windows in the 2 previous examples (if `switch-to-buffer-preserve-window-point' evaluates non-nil). >From 37c088a3cc0ae303dda570e4d93195131f6a9892 Mon Sep 17 00:00:00 2001 From: Tino Calancha Date: Fri, 27 May 2016 01:27:18 +0900 Subject: [PATCH] Editing same buffer in >1 window; winner-undo enhancement Allow winner-undo to restore the buffer point from deleted windows (Bug#23621). * lisp/window.el (window--before-delete-windows): New defun. (delete-window, delete-other-windows): Use it. * lisp/winner.el (winner-set): Use marker in 'window-prev-buffers' when available and different than the value returned by 'winner-get-point'. --- lisp/window.el | 39 +++++++++++++++++++++++++++++++++++++++ lisp/winner.el | 13 +++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/lisp/window.el b/lisp/window.el index bd5275b..7a7f9ac 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -3775,6 +3775,41 @@ window--in-subtree-p (throw 'done t) (setq parent (window-parent parent)))))))) +;; This function is called by `delete-window' and +;; `delete-other-windows' when `switch-to-buffer-preserve-window-point' +;; evaluates non-nil: it allows `winner-undo' to restore the +;; buffer point from deleted windows (Bug#23621). +(defun window--before-delete-windows (&optional window) + "Update `window-prev-buffers' before delete a window. +Optional arg WINDOW, if non-nil, update WINDOW-START and POS +in `window-prev-buffers' for all windows displaying same +buffer as WINDOW. Otherwise, update `window-prev-buffers' for +all windows. + +The new values for WINDOW-START and POS are those +returned by `window-start' and `window-point' respectively. + +This function is called only if `switch-to-buffer-preserve-window-point' +evaluates non-nil." + (dolist (win (window-list)) + (let* ((buf (window-buffer (or window win))) + (start (window-start win)) + (pos (window-point win)) + (entry (assq buf (window-prev-buffers win)))) + (cond (entry + (let ((marker (nth 2 entry))) + (unless (= pos marker) + (set-marker (nth 1 entry) start buf) + (set-marker marker pos buf)))) + (t + (let ((prev-buf (window-prev-buffers win)) + (start-m (make-marker)) + (pos-m (make-marker))) + (set-marker start-m start buf) + (set-marker pos-m pos buf) + (push (list buf start-m pos-m) prev-buf) + (set-window-prev-buffers win prev-buf))))))) + (defun delete-window (&optional window) "Delete WINDOW. WINDOW must be a valid window and defaults to the selected one. @@ -3793,6 +3828,8 @@ delete-window its frame, the last non-side window, or part of an atomic window that is its frame's root window." (interactive) + (when switch-to-buffer-preserve-window-point + (window--before-delete-windows window)) (setq window (window-normalize-window window)) (let* ((frame (window-frame window)) (function (window-parameter window 'delete-window)) @@ -3875,6 +3912,8 @@ delete-other-windows on the frame. Side windows are not deleted. If WINDOW is a side window signal an error." (interactive) + (when switch-to-buffer-preserve-window-point + (window--before-delete-windows)) (setq window (window-normalize-window window)) (let* ((frame (window-frame window)) (function (window-parameter window 'delete-other-windows)) diff --git a/lisp/winner.el b/lisp/winner.el index 9a6f5d5..2a213ab 100644 --- a/lisp/winner.el +++ b/lisp/winner.el @@ -297,8 +297,17 @@ winner-set ;; Restore points (dolist (win (winner-sorted-window-list)) (unless (and (pop alive) - (setf (window-point win) - (winner-get-point (window-buffer win) win)) + (let* ((buf (window-buffer win)) + (pos (winner-get-point (window-buffer win) win)) + (entry (assq buf (window-prev-buffers win)))) + ;; Try to restore point of buffer in the selected + ;; window (Bug#23621). + (let ((marker (nth 2 entry))) + (when (and switch-to-buffer-preserve-window-point + marker + (not (= marker pos))) + (setq pos marker)) + (setf (window-point win) pos))) (not (member (buffer-name (window-buffer win)) winner-boring-buffers))) (push win xwins))) ; delete this window -- 2.8.1