annotate lisp/winner.el @ 20969:6007dc30ec3b

*** empty log message ***
author Dan Nicolaescu <done@ece.arizona.edu>
date Wed, 25 Feb 1998 05:06:02 +0000
parents 7072722c5071
children 85cc901f00ee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
1 ;;; winner.el --- Restore window configuration (or switch buffer)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
3 ;; Copyright (C) 1997, 1998 Free Software Foundation. Inc.
17469
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
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
8 ;; Keywords: extensions, windows
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
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
29 ;; Winner mode is a global minor mode that when turned on records
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
30 ;; changes in window configuration. This way the changes can be
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
31 ;; "undone" using the function `winner-undo'. By default this one is
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
32 ;; bound to the key sequence ctrl-x left. If you change your mind
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
33 ;; (while undoing), you can press ctrl-x right (calling
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
34 ;; `winner-redo'). Unlike the normal undo, you may have to skip
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
35 ;; through several identical window configurations in order to find
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
36 ;; the one you want. This is a bug due to some techical limitations
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
37 ;; in Emacs and can maybe be fixed in the future.
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 ;;
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
39 ;; In addition to this I have added `winner-switch' which is a program
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
40 ;; that switches to other buffers without disturbing Winner mode. If
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
41 ;; you bind this command to a key sequence, you may step through all
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
42 ;; your buffers (except the ones mentioned in `winner-skip-buffers' or
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
43 ;; matched by `winner-skip-regexps'). With a numeric prefix argument
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
44 ;; skip several buffers at a time.
17469
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 ;;; Code:
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
48 (require 'cl)
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
49 (require 'ring)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
51 (defgroup winner nil
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
52 "Restoring window configurations."
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
53 :group 'windows)
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
54
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
55 (defcustom winner-mode nil
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
56 "Toggle winner-mode.
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
57 You must modify via \\[customize] for this variable to have an effect."
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
58 :set (lambda (symbol value)
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
59 (winner-mode (or value 0)))
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
60 :initialize 'custom-initialize-default
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
61 :type 'boolean
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
62 :group 'winner
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
63 :require 'winner)
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
64
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
65 (defcustom winner-dont-bind-my-keys nil
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
66 "If non-nil: Do not use `winner-mode-map' in Winner mode."
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
67 :type 'boolean
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
68 :group 'winner)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
70 (defvar winner-ring-size 100
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
71 "Maximum number of stored window configurations per frame.")
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
73 (defcustom winner-skip-buffers
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 '("*Messages*",
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 "*Compile-Log*",
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 ".newsrc-dribble",
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 "*Completions*",
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 "*Buffer list*")
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
79 "Exclude these buffer names from any \(Winner switch\) list of buffers."
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
80 :type '(repeat string)
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
81 :group 'winner)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
83 (defcustom winner-skip-regexps '("^ ")
19502
95f1938d0296 Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 18959
diff changeset
84 "Winner excludes buffers with names matching any of these regexps.
95f1938d0296 Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 18959
diff changeset
85 They are not included in any Winner mode list of buffers.
17469
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 By default `winner-skip-regexps' is set to \(\"^ \"\),
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
88 which excludes \"invisible buffers\"."
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
89 :type '(repeat regexp)
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
90 :group 'winner)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
92 (defvar winner-ring-alist nil)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
93
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
94 (defsubst winner-ring (frame)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
95 (or (cdr (assq frame winner-ring-alist))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
96 (progn
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
97 (push (cons frame (make-ring winner-ring-size))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
98 winner-ring-alist)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
99 (cdar winner-ring-alist))))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
100
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
101 (defvar winner-modified-list nil)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
102
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
103 (defun winner-change-fun ()
20047
735f0cdfc5b9 (winner-change-fun): Don't use pushnew.
Karl Heuer <kwzh@gnu.org>
parents: 19564
diff changeset
104 (or (memq (selected-frame) winner-modified-list)
735f0cdfc5b9 (winner-change-fun): Don't use pushnew.
Karl Heuer <kwzh@gnu.org>
parents: 19564
diff changeset
105 (push (selected-frame) winner-modified-list)))
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
106
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
107 (defun winner-save-new-configurations ()
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
108 (while winner-modified-list
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
109 (ring-insert
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
110 (winner-ring (car winner-modified-list))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
111 (current-window-configuration (pop winner-modified-list)))))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
112
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
113 (defun winner-set (conf)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
114 (set-window-configuration conf)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
115 (if (eq (selected-window) (minibuffer-window))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
116 (other-window 1)))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
117
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
118
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
119 ;;; Winner mode (a minor mode)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
121 (defcustom winner-mode-hook nil
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
122 "Functions to run whenever Winner mode is turned on."
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
123 :type 'hook
20969
6007dc30ec3b *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 20968
diff changeset
124 :group 'winner)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125
20969
6007dc30ec3b *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 20968
diff changeset
126 (defcustom winner-mode-leave-hook nil
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
127 "Functions to run whenever Winner mode is turned off."
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
128 :type 'hook
20969
6007dc30ec3b *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 20968
diff changeset
129 :group 'winner)
17469
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-map nil "Keymap for Winner mode.")
17470
c4cd2317fe60 Clean up comments, etc.
Richard M. Stallman <rms@gnu.org>
parents: 17469
diff changeset
132
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
133 ;;;###autoload
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 (defun winner-mode (&optional arg)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 "Toggle Winner mode.
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 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
137 (interactive "P")
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 (let ((on-p (if arg (> (prefix-numeric-value arg) 0)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 (not winner-mode))))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 (cond
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
141 ;; Turn mode on
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
142 (on-p
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
143 (setq winner-mode t)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
144 (add-hook 'window-configuration-change-hook 'winner-change-fun)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
145 (add-hook 'post-command-hook 'winner-save-new-configurations)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
146 (setq winner-modified-list (frame-list))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
147 (winner-save-new-configurations)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
148 (run-hooks 'winner-mode-hook))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
149 ;; Turn mode off
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
150 (winner-mode
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
151 (setq winner-mode nil)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
152 (run-hooks 'winner-mode-leave-hook)))
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 (force-mode-line-update)))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
155 ;; Inspired by undo (simple.el)
20086
92b4edaf6482 (winner-pending-undo-ring): Defvar before first use.
Karl Heuer <kwzh@gnu.org>
parents: 20047
diff changeset
156
92b4edaf6482 (winner-pending-undo-ring): Defvar before first use.
Karl Heuer <kwzh@gnu.org>
parents: 20047
diff changeset
157 (defvar winner-pending-undo-ring nil)
92b4edaf6482 (winner-pending-undo-ring): Defvar before first use.
Karl Heuer <kwzh@gnu.org>
parents: 20047
diff changeset
158
92b4edaf6482 (winner-pending-undo-ring): Defvar before first use.
Karl Heuer <kwzh@gnu.org>
parents: 20047
diff changeset
159 (defvar winner-undo-counter nil)
92b4edaf6482 (winner-pending-undo-ring): Defvar before first use.
Karl Heuer <kwzh@gnu.org>
parents: 20047
diff changeset
160
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
161 (defun winner-undo (arg)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
162 "Switch back to an earlier window configuration saved by Winner mode.
20968
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
163 In other words, \"undo\" changes in window configuration.
7072722c5071 (require 'cl) unconditionally.
Dave Love <fx@gnu.org>
parents: 20086
diff changeset
164 With prefix arg, undo that many levels."
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
165 (interactive "p")
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
166 (cond
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
167 ((not winner-mode) (error "Winner mode is turned off"))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
168 ((eq (selected-window) (minibuffer-window))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
169 (error "No winner undo from minibuffer."))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
170 (t (setq this-command t)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
171 (if (eq last-command 'winner-undo)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
172 ;; This was no new window configuration after all.
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
173 (ring-remove winner-pending-undo-ring 0)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
174 (setq winner-pending-undo-ring (winner-ring (selected-frame)))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
175 (setq winner-undo-counter 0))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
176 (winner-undo-more (or arg 1))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
177 (message "Winner undo (%d)!" winner-undo-counter)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
178 (setq this-command 'winner-undo))))
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
180 (defun winner-undo-more (count)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
181 "Undo N window configuration changes beyond what was already undone.
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
182 Call `winner-undo-start' to get ready to undo recent changes,
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
183 then call `winner-undo-more' one or more times to undo them."
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
184 (let ((len (ring-length winner-pending-undo-ring)))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
185 (incf winner-undo-counter count)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
186 (if (>= winner-undo-counter len)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
187 (error "No further window configuration undo information")
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
188 (winner-set
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
189 (ring-ref winner-pending-undo-ring
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
190 winner-undo-counter)))))
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
192 (defun winner-redo ()
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
193 "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
194 (interactive)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
195 (cond
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
196 ((eq last-command 'winner-undo)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
197 (ring-remove winner-pending-undo-ring 0)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
198 (winner-set
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
199 (ring-remove winner-pending-undo-ring 0))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
200 (or (eq (selected-window) (minibuffer-window))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
201 (message "Winner undid undo!")))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
202 (t (error "Previous command was not a winner-undo"))))
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
204 ;;; Winner switch
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
205
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
206 (defun winner-switch-buffer-list ()
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 (loop for buf in (buffer-list)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 for name = (buffer-name buf)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 unless (or (eq (current-buffer) buf)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 (member name winner-skip-buffers)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 (loop for regexp in winner-skip-regexps
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 if (string-match regexp name) return t
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 finally return nil))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 collect name))
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
215
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
216 (defvar winner-switch-list nil)
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
218 (defun winner-switch (count)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
219 "Step through your buffers without disturbing `winner-mode'.
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
220 `winner-switch' does not consider buffers mentioned in the list
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
221 `winner-skip-buffers' or matched by `winner-skip-regexps'."
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
222 (interactive "p")
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
223 (decf count)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
224 (setq this-command t)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
225 (cond
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
226 ((eq last-command 'winner-switch)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
227 (if winner-mode (ring-remove (winner-ring (selected-frame)) 0))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
228 (bury-buffer (current-buffer))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
229 (mapcar 'bury-buffer winner-switch-list))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
230 (t (setq winner-switch-list (winner-switch-buffer-list))))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
231 (setq winner-switch-list (nthcdr count winner-switch-list))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
232 (or winner-switch-list
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
233 (setq winner-switch-list (winner-switch-buffer-list))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
234 (error "No more buffers"))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
235 (switch-to-buffer (pop winner-switch-list))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
236 (message (concat "Winner: [%s] "
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
237 (mapconcat 'identity winner-switch-list " "))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
238 (buffer-name))
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
239 (setq this-command 'winner-switch))
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 ;;;; To be evaluated when the package is loaded:
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 (unless winner-mode-map
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 (setq winner-mode-map (make-sparse-keymap))
19564
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
245 (define-key winner-mode-map [?\C-x left] 'winner-undo)
8d89cc0f2b42 Many changes by Ivar Rummelhoff.
Richard M. Stallman <rms@gnu.org>
parents: 19502
diff changeset
246 (define-key winner-mode-map [?\C-x right] 'winner-redo))
17469
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 (unless (or (assq 'winner-mode minor-mode-map-alist)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 winner-dont-bind-my-keys)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 (push (cons 'winner-mode winner-mode-map)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 minor-mode-map-alist))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 (unless (assq 'winner-mode minor-mode-alist)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 (push '(winner-mode " Win") minor-mode-alist))
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 (provide 'winner)
141077afaa74 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257
17470
c4cd2317fe60 Clean up comments, etc.
Richard M. Stallman <rms@gnu.org>
parents: 17469
diff changeset
258 ;;; winner.el ends here