annotate lisp/winner.el @ 61263:56619c3aaf99

(fancy-splash-text): Shorten default text of "Emacs Tutorial" line. Also, if the current language env indicates an available tutorial file other than TUTORIAL, extract its title and append it to the line in parentheses. (fancy-splash-insert): If arg is a thunk, funcall it.
author Thien-Thi Nguyen <ttn@gnuvola.org>
date Mon, 04 Apr 2005 07:41:58 +0000
parents 5201ea9b1985
children 6fb026ad601f b637c617432f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
1 ;;; winner.el --- Restore old window configurations
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
55349
96c2a9272e97 (winner-mode-map): Move winner-undo and winner-redo to C-c <left> and C-c
Juanma Barranquero <lekktu@gmail.com>
parents: 52401
diff changeset
3 ;; Copyright (C) 1997, 1998, 2001, 2004 Free Software Foundation. Inc.
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
28071
2420cf232647 Update maintainer address.
Dave Love <fx@gnu.org>
parents: 28023
diff changeset
5 ;; Author: Ivar Rummelhoff <ivarru@math.uio.no>
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 ;; Created: 27 Feb 1997
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
7 ;; Time-stamp: <2002-02-20 22:06:58 ivarru>
28023
3978c673322b Fix keywords, autoload cookies. Split
Dave Love <fx@gnu.org>
parents: 25733
diff changeset
8 ;; Keywords: convenience frames
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
17470
c4cd2317fe60 Clean up comments, etc.
Richard M. Stallman <rms@gnu.org>
parents: 17469
diff changeset
10 ;; This file is part of GNU Emacs.
c4cd2317fe60 Clean up comments, etc.
Richard M. Stallman <rms@gnu.org>
parents: 17469
diff changeset
11
c4cd2317fe60 Clean up comments, etc.
Richard M. Stallman <rms@gnu.org>
parents: 17469
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 ;; any later version.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
17470
c4cd2317fe60 Clean up comments, etc.
Richard M. Stallman <rms@gnu.org>
parents: 17469
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 ;; Boston, MA 02111-1307, USA.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 ;;; Commentary:
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
28
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
29 ;; Winner mode is a global minor mode that records the changes in the
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
30 ;; window configuration (i.e. how the frames are partitioned into
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
31 ;; windows) so that the changes can be "undone" using the command
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
32 ;; `winner-undo'. By default this one is bound to the key sequence
55349
96c2a9272e97 (winner-mode-map): Move winner-undo and winner-redo to C-c <left> and C-c
Juanma Barranquero <lekktu@gmail.com>
parents: 52401
diff changeset
33 ;; ctrl-c left. If you change your mind (while undoing), you can
96c2a9272e97 (winner-mode-map): Move winner-undo and winner-redo to C-c <left> and C-c
Juanma Barranquero <lekktu@gmail.com>
parents: 52401
diff changeset
34 ;; press ctrl-c right (calling `winner-redo'). Even though it uses
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
35 ;; some features of Emacs20.3, winner.el should also work with
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
36 ;; Emacs19.34 and XEmacs20, provided that the installed version of
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
37 ;; custom is not obsolete.
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
39 ;; Winner mode was improved August 1998.
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
40 ;; Further improvements February 2002.
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
41
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
42 ;;; Code:
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
43
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
44 (eval-when-compile
28023
3978c673322b Fix keywords, autoload cookies. Split
Dave Love <fx@gnu.org>
parents: 25733
diff changeset
45 (require 'cl))
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46
58213
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
47
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
48 (defmacro winner-active-region ()
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
49 (if (fboundp 'region-active-p)
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
50 '(region-active-p)
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
51 'mark-active))
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
52
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
53 (defsetf winner-active-region () (store)
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
54 (if (fboundp 'zmacs-activate-region)
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
55 `(if ,store (zmacs-activate-region)
58213
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
56 (zmacs-deactivate-region))
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
57 `(setq mark-active ,store)))
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
58
58213
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
59 (defalias 'winner-edges
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
60 (if (featurep 'xemacs) 'window-pixel-edges 'window-edges))
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
61 (defalias 'winner-window-list
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
62 (if (featurep 'xemacs)
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
63 (lambda () (delq (minibuffer-window) (window-list nil 0)))
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
64 (lambda () (window-list nil 0))))
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
65
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
66 (require 'ring)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67
48248
ee08f1e3d269 (defgroup winner): Handle Emacs 19 compatibility so that definition
Markus Rost <rost@math.uni-bielefeld.de>
parents: 43556
diff changeset
68 (unless (fboundp 'defgroup)
ee08f1e3d269 (defgroup winner): Handle Emacs 19 compatibility so that definition
Markus Rost <rost@math.uni-bielefeld.de>
parents: 43556
diff changeset
69 (defmacro defgroup (&rest rest)))
ee08f1e3d269 (defgroup winner): Handle Emacs 19 compatibility so that definition
Markus Rost <rost@math.uni-bielefeld.de>
parents: 43556
diff changeset
70
ee08f1e3d269 (defgroup winner): Handle Emacs 19 compatibility so that definition
Markus Rost <rost@math.uni-bielefeld.de>
parents: 43556
diff changeset
71 (defgroup winner nil
ee08f1e3d269 (defgroup winner): Handle Emacs 19 compatibility so that definition
Markus Rost <rost@math.uni-bielefeld.de>
parents: 43556
diff changeset
72 "Restoring window configurations."
ee08f1e3d269 (defgroup winner): Handle Emacs 19 compatibility so that definition
Markus Rost <rost@math.uni-bielefeld.de>
parents: 43556
diff changeset
73 :group 'windows)
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
74
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
75 (unless (fboundp 'defcustom)
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
76 (defmacro defcustom (symbol &optional initvalue docs &rest rest)
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
77 (list 'defvar symbol initvalue docs)))
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
78
28023
3978c673322b Fix keywords, autoload cookies. Split
Dave Love <fx@gnu.org>
parents: 25733
diff changeset
79 ;;;###autoload
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
80 (defcustom winner-mode nil
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
81 "Toggle winner-mode.
24637
331cca02c844 (winner-mode): Doc fix.
Dave Love <fx@gnu.org>
parents: 24590
diff changeset
82 Setting this variable directly does not take effect;
331cca02c844 (winner-mode): Doc fix.
Dave Love <fx@gnu.org>
parents: 24590
diff changeset
83 use either \\[customize] or the function `winner-mode'."
58213
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
84 :set #'(lambda (symbol value) (funcall symbol (or value 0)))
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
85 :initialize 'custom-initialize-default
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
86 :type 'boolean
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
87 :group 'winner
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
88 :require 'winner)
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
89
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
90 (defcustom winner-dont-bind-my-keys nil
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
91 "If non-nil: Do not use `winner-mode-map' in Winner mode."
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
92 :type 'boolean
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
93 :group 'winner)
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
94
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
95 (defcustom winner-ring-size 200
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
96 "Maximum number of stored window configurations per frame."
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
97 :type 'integer
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
98 :group 'winner)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
100 (defcustom winner-boring-buffers '("*Completions*")
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
101 "`winner-undo' will not restore windows displaying any of these \
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
102 buffers.
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
103 You may want to include buffer names such as *Help*, *Apropos*,
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
104 *Buffer List*, *info* and *Compile-Log*."
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
105 :type '(repeat string)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
106 :group 'winner)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
107
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
108
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
109
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
111 ;;;; Saving old configurations (internal variables and subroutines)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
112
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
113
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
114 ;;; Current configuration
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
115
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
116 ;; List the windows according to their edges.
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
117 (defun winner-sorted-window-list ()
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
118 (sort (winner-window-list)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
119 (lambda (x y)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
120 (loop for a in (winner-edges x)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
121 for b in (winner-edges y)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
122 while (= a b)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
123 finally return (< a b)))))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
124
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
125 (defun winner-win-data ()
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
126 ;; Essential properties of the windows in the selected frame.
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
127 (loop for win in (winner-sorted-window-list)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
128 collect (cons (winner-edges win) (window-buffer win))))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
129
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
130 ;; This variable is updated with the current window configuration
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
131 ;; every time it changes.
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
132 (defvar winner-currents nil)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
133
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
134 ;; The current configuration (+ the buffers involved).
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
135 (defsubst winner-conf ()
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
136 (cons (current-window-configuration)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
137 (winner-win-data)))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
138
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
139
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
140 ;; Save current configuration.
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
141 ;; (Called below by `winner-save-old-configurations').
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
142 (defun winner-remember ()
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
143 (let ((entry (assq (selected-frame) winner-currents)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
144 (if entry (setcdr entry (winner-conf))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
145 (push (cons (selected-frame) (winner-conf))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
146 winner-currents))))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
147
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
148 ;; Consult `winner-currents'.
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
149 (defun winner-configuration (&optional frame)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
150 (or (cdr (assq (or frame (selected-frame)) winner-currents))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
151 (letf (((selected-frame) frame))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
152 (winner-conf))))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
153
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
154
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
156 ;;; Saved configurations
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
157
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
158 ;; This variable contains the window cofiguration rings.
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
159 ;; The key in this alist is the frame.
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
160 (defvar winner-ring-alist nil)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
161
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
162 ;; Find the right ring. If it does not exist, create one.
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
163 (defsubst winner-ring (frame)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
164 (or (cdr (assq frame winner-ring-alist))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
165 (progn
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
166 (let ((ring (make-ring winner-ring-size)))
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
167 (ring-insert ring (winner-configuration frame))
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
168 (push (cons frame ring) winner-ring-alist)
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
169 ring))))
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
170
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
171 ;; If the same command is called several times in a row,
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
172 ;; we only save one window configuration.
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
173 (defvar winner-last-command nil)
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
174
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
175 ;; Frames affected by the previous command.
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
176 (defvar winner-last-frames nil)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
177
38334
63281ffd14fd (winner-equal): Make it a defun. Don't compare Winner
Gerd Moellmann <gerd@gnu.org>
parents: 28071
diff changeset
178
63281ffd14fd (winner-equal): Make it a defun. Don't compare Winner
Gerd Moellmann <gerd@gnu.org>
parents: 28071
diff changeset
179 (defun winner-equal (a b)
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
180 "Check whether two Winner configurations (as produced by
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
181 `winner-conf') are equal."
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
182 (equal (cdr a) (cdr b)))
38334
63281ffd14fd (winner-equal): Make it a defun. Don't compare Winner
Gerd Moellmann <gerd@gnu.org>
parents: 28071
diff changeset
183
63281ffd14fd (winner-equal): Make it a defun. Don't compare Winner
Gerd Moellmann <gerd@gnu.org>
parents: 28071
diff changeset
184
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
185 ;; Save the current window configuration, if it has changed.
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
186 ;; If so return frame, otherwise return nil.
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
187 (defun winner-insert-if-new (frame)
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
188 (unless (or (memq frame winner-last-frames)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
189 (eq this-command 'winner-redo))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
190 (let ((conf (winner-configuration frame))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
191 (ring (winner-ring frame)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
192 (when (and (not (ring-empty-p ring))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
193 (winner-equal conf (ring-ref ring 0)))
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
194 ;; When the previous configuration was very similar,
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
195 ;; keep only the latest.
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
196 (ring-remove ring 0))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
197 (ring-insert ring conf)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
198 (push frame winner-last-frames)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
199 frame)))
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
200
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
201
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
202
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
203 ;;; Hooks
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
204
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
205 ;; Frames affected by the current command.
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
206 (defvar winner-modified-list nil)
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
207
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
208 ;; Called whenever the window configuration changes
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
209 ;; (a `window-configuration-change-hook').
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
210 (defun winner-change-fun ()
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
211 (unless (or (memq (selected-frame) winner-modified-list)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
212 (/= 0 (minibuffer-depth)))
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
213 (push (selected-frame) winner-modified-list)))
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
214
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
215 ;; A `post-command-hook' for emacsen with
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
216 ;; `window-configuration-change-hook'.
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
217 (defun winner-save-old-configurations ()
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
218 (when (zerop (minibuffer-depth))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
219 (unless (eq this-command winner-last-command)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
220 (setq winner-last-frames nil)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
221 (setq winner-last-command this-command))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
222 (dolist (frame winner-modified-list)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
223 (winner-insert-if-new frame))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
224 (setq winner-modified-list nil)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
225 (winner-remember)))
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
226
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
227 ;; A `minibuffer-setup-hook'.
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
228 (defun winner-save-unconditionally ()
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
229 (unless (eq this-command winner-last-command)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
230 (setq winner-last-frames nil)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
231 (setq winner-last-command this-command))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
232 (winner-insert-if-new (selected-frame))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
233 (winner-remember))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
234
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
235 ;; A `post-command-hook' for other emacsen.
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
236 ;; Also called by `winner-undo' before "undoing".
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
237 (defun winner-save-conditionally ()
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
238 (when (zerop (minibuffer-depth))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
239 (winner-save-unconditionally)))
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
240
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
241
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
242
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
243 ;;;; Restoring configurations
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
244
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
245 ;; Works almost as `set-window-configuration',
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
246 ;; but does not change the contents or the size of the minibuffer,
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
247 ;; and tries to preserve the selected window.
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
248 (defun winner-set-conf (winconf)
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
249 (let* ((miniwin (minibuffer-window))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
250 (chosen (selected-window))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
251 (minisize (window-height miniwin)))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
252 (letf (((window-buffer miniwin))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
253 ((window-point miniwin)))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
254 (set-window-configuration winconf))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
255 (cond
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
256 ((window-live-p chosen) (select-window chosen))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
257 ((window-minibuffer-p (selected-window))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
258 (other-window 1)))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
259 (when (/= minisize (window-height miniwin))
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
260 (letf (((selected-window) miniwin) )
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
261 (setf (window-height) minisize)))))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
262
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
263
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
264
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
265 (defvar winner-point-alist nil)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
266 ;; `set-window-configuration' restores old points and marks. This is
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
267 ;; not what we want, so we make a list of the "real" (i.e. new) points
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
268 ;; and marks before undoing window configurations.
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
269 ;;
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
270 ;; Format of entries: (buffer (mark . mark-active) (window . point) ..)
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
271
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
272 (defun winner-make-point-alist ()
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
273 (letf (((current-buffer)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
274 (loop with alist
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
275 for win in (winner-window-list)
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
276 for entry =
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
277 (or (assq (window-buffer win) alist)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
278 (car (push (list (set-buffer (window-buffer win))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
279 (cons (mark t) (winner-active-region)))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
280 alist)))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
281 do (push (cons win (window-point win))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
282 (cddr entry))
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
283 finally return alist)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
284
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
285 (defun winner-get-point (buf win)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
286 ;; Consult (and possibly extend) `winner-point-alist'.
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
287 ;; Returns nil iff buf no longer exists.
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
288 (when (buffer-name buf)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
289 (let ((entry (assq buf winner-point-alist)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
290 (cond
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
291 (entry
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
292 (or (cdr (assq win (cddr entry)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
293 (cdr (assq nil (cddr entry)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
294 (letf (((current-buffer) buf))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
295 (push (cons nil (point)) (cddr entry))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
296 (point))))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
297 (t (letf (((current-buffer) buf))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
298 (push (list buf
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
299 (cons (mark t) (winner-active-region))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
300 (cons nil (point)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
301 winner-point-alist)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
302 (point)))))))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
303
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
304 ;; Make sure point does not end up in the minibuffer and delete
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
305 ;; windows displaying dead or boring buffers
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
306 ;; (c.f. `winner-boring-buffers'). Return nil iff all the windows
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
307 ;; should be deleted. Preserve correct points and marks.
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
308 (defun winner-set (conf)
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
309 ;; For the format of `conf', see `winner-conf'.
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
310 (let* ((buffers nil)
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
311 (alive
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
312 ;; Possibly update `winner-point-alist'
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
313 (loop for buf in (mapcar 'cdr (cdr conf))
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
314 for pos = (winner-get-point buf nil)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
315 if (and pos (not (memq buf buffers)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
316 do (push buf buffers)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
317 collect pos)))
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
318 (winner-set-conf (car conf))
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
319 (let (xwins) ; to be deleted
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
320
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
321 ;; Restore points
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
322 (dolist (win (winner-sorted-window-list))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
323 (unless (and (pop alive)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
324 (setf (window-point win)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
325 (winner-get-point (window-buffer win) win))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
326 (not (member (buffer-name (window-buffer win))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
327 winner-boring-buffers)))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
328 (push win xwins))) ; delete this window
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
329
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
330 ;; Restore marks
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
331 (letf (((current-buffer)))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
332 (loop for buf in buffers
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
333 for entry = (cadr (assq buf winner-point-alist))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
334 do (progn (set-buffer buf)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
335 (set-mark (car entry))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
336 (setf (winner-active-region) (cdr entry)))))
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
337 ;; Delete windows, whose buffers are dead or boring.
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
338 ;; Return t if this is still a possible configuration.
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
339 (or (null xwins)
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
340 (progn
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
341 (mapc 'delete-window (cdr xwins)) ; delete all but one
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
342 (unless (one-window-p t)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
343 (delete-window (car xwins))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
344 t))))))
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
345
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
346
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
347
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
348 ;;;; Winner mode (a minor mode)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
350 (defcustom winner-mode-hook nil
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
351 "Functions to run whenever Winner mode is turned on."
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
352 :type 'hook
20969
6007dc30ec3b *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 20968
diff changeset
353 :group 'winner)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354
20969
6007dc30ec3b *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 20968
diff changeset
355 (defcustom winner-mode-leave-hook nil
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
356 "Functions to run whenever Winner mode is turned off."
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
357 :type 'hook
20969
6007dc30ec3b *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 20968
diff changeset
358 :group 'winner)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359
58213
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
360 (defvar winner-mode-map
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
361 (let ((map (make-sparse-keymap)))
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
362 (define-key map [(control c) left] 'winner-undo)
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
363 (define-key map [(control c) right] 'winner-redo)
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
364 map)
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
365 "Keymap for Winner mode.")
17470
c4cd2317fe60 Clean up comments, etc.
Richard M. Stallman <rms@gnu.org>
parents: 17469
diff changeset
366
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
367 ;; Check if `window-configuration-change-hook' is working.
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
368 (defun winner-hook-installed-p ()
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
369 (save-window-excursion
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
370 (let ((winner-var nil)
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
371 (window-configuration-change-hook
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
372 '((lambda () (setq winner-var t)))))
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
373 (split-window)
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
374 winner-var)))
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
375
28023
3978c673322b Fix keywords, autoload cookies. Split
Dave Love <fx@gnu.org>
parents: 25733
diff changeset
376
3978c673322b Fix keywords, autoload cookies. Split
Dave Love <fx@gnu.org>
parents: 25733
diff changeset
377 ;;;###autoload
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 (defun winner-mode (&optional arg)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 "Toggle Winner mode.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 With arg, turn Winner mode on if and only if arg is positive."
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 (interactive "P")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 (let ((on-p (if arg (> (prefix-numeric-value arg) 0)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 (not winner-mode))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 (cond
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
385 ;; Turn mode on
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
386 (on-p
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
387 (setq winner-mode t)
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
388 (cond
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
389 ((winner-hook-installed-p)
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
390 (add-hook 'window-configuration-change-hook 'winner-change-fun)
58213
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
391 (add-hook 'post-command-hook 'winner-save-old-configurations))
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
392 (t (add-hook 'post-command-hook 'winner-save-conditionally)))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
393 (add-hook 'minibuffer-setup-hook 'winner-save-unconditionally)
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
394 (setq winner-modified-list (frame-list))
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
395 (winner-save-old-configurations)
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
396 (run-hooks 'winner-mode-hook)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
397 (when (interactive-p) (message "Winner mode enabled")))
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
398 ;; Turn mode off
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
399 (winner-mode
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
400 (setq winner-mode nil)
21125
d66c9c7b4927 Use list syntax for key definitions.
Richard M. Stallman <rms@gnu.org>
parents: 21016
diff changeset
401 (remove-hook 'window-configuration-change-hook 'winner-change-fun)
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
402 (remove-hook 'post-command-hook 'winner-save-old-configurations)
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
403 (remove-hook 'post-command-hook 'winner-save-conditionally)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
404 (remove-hook 'minibuffer-setup-hook 'winner-save-unconditionally)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
405 (run-hooks 'winner-mode-leave-hook)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
406 (when (interactive-p) (message "Winner mode disabled"))))))
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
408 ;; Inspired by undo (simple.el)
24590
d607db83cf72 Reorder definitions.
Richard M. Stallman <rms@gnu.org>
parents: 24550
diff changeset
409
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
410 (defvar winner-undo-frame nil)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
411
24590
d607db83cf72 Reorder definitions.
Richard M. Stallman <rms@gnu.org>
parents: 24550
diff changeset
412 (defvar winner-pending-undo-ring nil
d607db83cf72 Reorder definitions.
Richard M. Stallman <rms@gnu.org>
parents: 24550
diff changeset
413 "The ring currently used by winner undo.")
d607db83cf72 Reorder definitions.
Richard M. Stallman <rms@gnu.org>
parents: 24550
diff changeset
414 (defvar winner-undo-counter nil)
d607db83cf72 Reorder definitions.
Richard M. Stallman <rms@gnu.org>
parents: 24550
diff changeset
415 (defvar winner-undone-data nil) ; There confs have been passed.
d607db83cf72 Reorder definitions.
Richard M. Stallman <rms@gnu.org>
parents: 24550
diff changeset
416
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
417 (defun winner-undo ()
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
418 "Switch back to an earlier window configuration saved by Winner mode.
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
419 In other words, \"undo\" changes in window configuration."
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
420 (interactive)
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
421 (cond
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
422 ((not winner-mode) (error "Winner mode is turned off"))
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
423 (t (unless (and (eq last-command 'winner-undo)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
424 (eq winner-undo-frame (selected-frame)))
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
425 (winner-save-conditionally) ; current configuration->stack
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
426 (setq winner-undo-frame (selected-frame))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
427 (setq winner-point-alist (winner-make-point-alist))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
428 (setq winner-pending-undo-ring (winner-ring (selected-frame)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
429 (setq winner-undo-counter 0)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
430 (setq winner-undone-data (list (winner-win-data))))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
431 (incf winner-undo-counter) ; starting at 1
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
432 (when (and (winner-undo-this)
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
433 (not (window-minibuffer-p (selected-window))))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
434 (message "Winner undo (%d / %d)"
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
435 winner-undo-counter
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
436 (1- (ring-length winner-pending-undo-ring)))))))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
437
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
438
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
439
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
440 (defun winner-undo-this () ; The heart of winner undo.
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
441 (loop
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
442 (cond
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
443 ((>= winner-undo-counter (ring-length winner-pending-undo-ring))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
444 (message "No further window configuration undo information")
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
445 (return nil))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
446
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
447 ((and ; If possible configuration
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
448 (winner-set (ring-ref winner-pending-undo-ring
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
449 winner-undo-counter))
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
450 ; .. and new configuration
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
451 (let ((data (winner-win-data)))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
452 (and (not (member data winner-undone-data))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
453 (push data winner-undone-data))))
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
454 (return t)) ; .. then everything is fine.
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
455 (t ;; Otherwise, discharge it (and try the next one).
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
456 (ring-remove winner-pending-undo-ring winner-undo-counter)))))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48248
diff changeset
457
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
459 (defun winner-redo () ; If you change your mind.
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
460 "Restore a more recent window configuration saved by Winner mode."
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
461 (interactive)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
462 (cond
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
463 ((eq last-command 'winner-undo)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
464 (winner-set
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
465 (if (zerop (minibuffer-depth))
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
466 (ring-remove winner-pending-undo-ring 0)
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
467 (ring-ref winner-pending-undo-ring 0)))
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
468 (unless (eq (selected-window) (minibuffer-window))
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
469 (message "Winner undid undo")))
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
470 (t (error "Previous command was not a winner-undo"))))
43556
9e4a1be87f8c (winner-boring-buffers, winner-set): A window which
Richard M. Stallman <rms@gnu.org>
parents: 38334
diff changeset
471
25639
8d9a53e6b71c Major changes. Avoid changing point and mark.
Richard M. Stallman <rms@gnu.org>
parents: 24637
diff changeset
472 ;;; To be evaluated when the package is loaded:
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 (unless (or (assq 'winner-mode minor-mode-map-alist)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 winner-dont-bind-my-keys)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 (push (cons 'winner-mode winner-mode-map)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 minor-mode-map-alist))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 (provide 'winner)
58213
5201ea9b1985 (winner-active-region, winner-edges, winner-window-list): Define at toplevel.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55349
diff changeset
480 ;; arch-tag: 686d1c1b-010e-42ca-a192-b5685112418f
17470
c4cd2317fe60 Clean up comments, etc.
Richard M. Stallman <rms@gnu.org>
parents: 17469
diff changeset
481 ;;; winner.el ends here