annotate lisp/winner.el @ 17469:141077afaa74

Initial revision
author Richard M. Stallman <rms@gnu.org>
date Tue, 15 Apr 1997 05:03:20 +0000
parents
children c4cd2317fe60
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 ;;; winner.el --- Restore window configuration or change buffer
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3 ;; (C) 1997 Ivar Rummelhoff
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 ;; Author: Ivar Rummelhoff <ivarr@ifi.uio.no>
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 ;; Maintainer: Ivar Rummelhoff <ivarr@ifi.uio.no>
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 ;; Created: 27 Feb 1997
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 ;; Version: 1.13
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 ;; RCS: $Id: winner.el,v 1.13 1997/04/01 11:11:12 ivarr Exp ivarr $
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; Keywords: extensions,windows
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 ;; Location: http://www.ifi.uio.no/~ivarr/share/elisp/
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; This program is free software; you can redistribute it and/or modify
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; 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
15 ;; the Free Software Foundation; either version 2, or (at your option)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; any later version.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; This program is distributed in the hope that it will be useful,
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 ;; GNU General Public License for more details.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24 ;; 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
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 ;; Boston, MA 02111-1307, USA.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 ;;; Commentary:
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 ;; Winner.el provides a minor mode (`winner-mode') that does
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 ;; essentially two things:
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 ;; 1) It keeps track of changing window configurations, so that
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 ;; when you wish to go back to a previous view, all you have
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 ;; to do is to press C-left a couple of times.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 ;; 2) It lets you switch to other buffers by pressing C-right.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 ;; Installation:
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 ;; 1. Put this file in a directory on your (emacs) load-path
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 ;; 2. Byte-compile the file (eg. with M-x byte-compile-file)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 ;; 3. Put these two lines in your .emacs - file:
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 ;; (autoload 'winner-mode "winner" "Toggle Winner mode." t)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 ;; (add-hook 'after-init-hook (lambda () (winner-mode 1)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 ;; 4. Restart emacs for changes to take effect.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 ;; (This version of) Winner will only run properly
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 ;; on Emacs-19.35 or newer.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 ;; Details:
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 ;; 1. You may of course decide to use other bindings than those
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 ;; mentioned above. Just set these variables in your .emacs:
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 ;; `winner-prev-event'
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 ;; `winner-next-event'
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 ;; 2. When you have found the view of your choice
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 ;; (using your favourite keys), you may press ctrl-space
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 ;; (`winner-max-event') to `delete-other-windows'.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 ;; 3. Winner now keeps one configuration stack for each frame.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 ;; Yours sincerely, Ivar Rummelhoff
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 ;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 ;;; Code:
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79 ;;;; Variables you may want to change
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 (defvar winner-prev-event 'C-left
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82 "Winner mode binds this event to the command `winner-previous'.")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84 (defvar winner-next-event 'C-right
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 "Winner mode binds this event to the command `winner-next'.")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 (defvar winner-max-event 67108896 ; CTRL-space
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 "Event for deleting other windows
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 after having selected a view with Winner.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 The normal functions of this event will also be performed.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 In the default case (CTRL-SPACE) the mark will be set.")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 (defvar winner-skip-buffers
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 '("*Messages*",
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 "*Compile-Log*",
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 ".newsrc-dribble",
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 "*Completions*",
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 "*Buffer list*")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 "Exclude these buffer names
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 from any \(Winner mode\) list of buffers.")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 (defvar winner-skip-regexps '("^ ")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 "Exclude buffers with names matching any of these regexps.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 ..from any \(Winner mode\) list of buffers.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 By default `winner-skip-regexps' is set to \(\"^ \"\),
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108 which excludes \"invisible buffers\".")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 (defvar winner-limit 50
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 "Winner will save no more than 2 * `winner-limit' window configurations.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 \(.. and no less than `winner-limit'.\)")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 (defvar winner-mode-hook nil
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 "Functions to run whenever Winner mode is turned on.")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 (defvar winner-mode-leave-hook nil
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 "Functions to run whenever Winner mode is turned off.")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 (defvar winner-dont-bind-my-keys nil
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 "If non-nil: Do not use `winner-mode-map' in Winner mode.")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 ;;;; Winner mode
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 (eval-when-compile (require 'cl))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 (defvar winner-mode nil) ; For the modeline.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132 (defvar winner-mode-map nil "Keymap for Winner mode.")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133 (defun winner-mode (&optional arg)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 "Toggle Winner mode.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 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
136 (interactive "P")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 (let ((on-p (if arg (> (prefix-numeric-value arg) 0)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 (not winner-mode))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 (cond
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 (on-p (let ((winner-frames-changed (frame-list)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 (winner-do-save)) ; Save current configurations
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 (add-hook 'window-configuration-change-hook 'winner-save-configuration)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 (setq winner-mode t)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 (run-hooks 'winner-mode-hook))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 (t (remove-hook 'window-configuration-change-hook 'winner-save-configuration)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 (when winner-mode
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 (setq winner-mode nil)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 (run-hooks 'winner-mode-leave-hook))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 (force-mode-line-update)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 ;; List of frames which have changed
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 (defvar winner-frames-changed nil)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 ;; Time to save the window configuration.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 (defun winner-save-configuration ()
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 (push (selected-frame) winner-frames-changed)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 (add-hook 'post-command-hook 'winner-do-save))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 (defun winner-do-save ()
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 (let ((current (selected-frame)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 (unwind-protect
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 (do ((frames winner-frames-changed (cdr frames)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 ((null frames))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 (unless (memq (car frames) (cdr frames))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 ;; Process each frame once.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 (select-frame (car frames))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 (winner-push (current-window-configuration) (car frames))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 (setq winner-frames-changed nil)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 (select-frame current)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 (remove-hook 'post-command-hook 'winner-do-save))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 ;;;; Configuration stacks (one for each frame)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 (defvar winner-stacks nil) ; ------ " ------
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 ;; A stack of window configurations with some additional information.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 (defstruct (winner-stack
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 (:constructor winner-stack-new
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 (config &aux
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 (data (list config))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 (place data))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 data place (count 1))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 ;; Return the stack of this frame
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 (defun winner-stack (frame)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 (let ((stack (cdr (assq frame winner-stacks))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 (if stack (winner-stack-data stack)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 ;; Else make new stack
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 (letf (((selected-frame) frame))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 (let ((config (current-window-configuration)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 (push (cons frame (winner-stack-new config))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 winner-stacks)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 (list config))))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 ;; Push this window configuration on the right stack,
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 ;; but make sure the stack doesn't get too large etc...
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 (defun winner-push (config frame)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 (let ((this (cdr (assq frame winner-stacks))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 (if (not this) (push (cons frame (winner-stack-new config))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 winner-stacks)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 (push config (winner-stack-data this))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 (when (> (incf (winner-stack-count this)) winner-limit)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 ;; No more than 2*winner-limit configs
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 (setcdr (winner-stack-place this) nil)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 (setf (winner-stack-place this)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 (winner-stack-data this))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 (setf (winner-stack-count this) 1)))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 ;;;; Selecting a window configuration
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 ;; Return list of names of other buffers, excluding the current buffer
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 ;; and buffers specified by the user.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 (defun winner-other-buffers ()
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 (loop for buf in (buffer-list)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 for name = (buffer-name buf)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 unless (or (eq (current-buffer) buf)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 (member name winner-skip-buffers)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 (loop for regexp in winner-skip-regexps
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 if (string-match regexp name) return t
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 finally return nil))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 collect name))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 (defun winner-select (&optional arg)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 "Change to previous or new window configuration.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 With arg start at position 1 if arg is positive, and
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 at -1 if arg is negative; else start at position 0.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 \(For Winner to record changes in window configurations,
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 Winner mode must be turned on.\)"
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 (interactive "P")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 (setq arg
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 (cond
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 ((not arg) nil)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 ((> (prefix-numeric-value arg) 0) winner-next-event)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 ((< (prefix-numeric-value arg) 0) winner-prev-event)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 (t nil)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 (if arg (push arg unread-command-events))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 (let ((stack (winner-stack (selected-frame)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 (store nil)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 (buffers (winner-other-buffers))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 (passed nil)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 (config (current-window-configuration))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 (pos 0) event)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 ;; `stack' and `store' are stacks of window configuration while
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 ;; `buffers' and `passed' are stacks of buffer names.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 (condition-case nil
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 (loop
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 (setq event (read-event))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 (cond
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 ((eq event winner-prev-event)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 (cond (passed (push (pop passed) buffers)(decf pos))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 ((cdr stack)(push (pop stack) store) (decf pos))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 (t (setq stack (append (nreverse store) stack))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 (setq store nil)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 (setq pos 0))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 ((eq event winner-next-event)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 (cond (store (push (pop store) stack) (incf pos))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 (buffers (push (pop buffers) passed) (incf pos))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 (t (setq buffers (nreverse passed))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 (setq passed nil)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 (setq pos 0))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 ((eq event winner-max-event)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 ;; Delete other windows and leave.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 (delete-other-windows)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 ;; Let this change be saved.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 (setq pos -1)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 ;; Perform other actions of this event.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 (push event unread-command-events)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 (return))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 (t (push event unread-command-events) (return)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 (cond
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 ;; Display
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 (passed (set-window-buffer (selected-window) (car passed))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 (message (concat "Winner\(%d\): [%s] "
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 (mapconcat 'identity buffers " "))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 pos (car passed)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 (t (set-window-configuration (car stack))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 (if (window-minibuffer-p (selected-window))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 (other-window 1))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 (message "Winner\(%d\)" pos))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 (quit (set-window-configuration config)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 (setq pos 0)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 (if (zerop pos)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 ;; Do not record these changes.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 (remove-hook 'post-command-hook 'winner-do-save)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 ;; Else update the buffer list and make sure that the displayed
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 ;; buffer is the same as the current buffer.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 (switch-to-buffer (window-buffer)))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 (defun winner-previous ()
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 "Change to previous window configuration."
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 (interactive)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 (winner-select -1))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 (defun winner-next ()
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 "Change to new window configuration."
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 (interactive)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 (winner-select 1))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 ;;;; To be evaluated when the package is loaded:
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 (unless winner-mode-map
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 (setq winner-mode-map (make-sparse-keymap))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 (define-key winner-mode-map (vector winner-prev-event) 'winner-previous)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 (define-key winner-mode-map (vector winner-next-event) 'winner-next))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 (unless (or (assq 'winner-mode minor-mode-map-alist)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 winner-dont-bind-my-keys)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 (push (cons 'winner-mode winner-mode-map)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 minor-mode-map-alist))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 (unless (assq 'winner-mode minor-mode-alist)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 (push '(winner-mode " Win") minor-mode-alist))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 (provide 'winner)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 ;;; Winner.el ends here