Mercurial > hg > xemacs-beta
comparison lisp/hyperbole/wconfig.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 4103f0995bd7 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:376386a54a3c |
---|---|
1 ;;!emacs | |
2 ;; | |
3 ;; FILE: wconfig.el | |
4 ;; SUMMARY: Saves and yanks from save ring of window configurations. | |
5 ;; USAGE: GNU Emacs Lisp Library | |
6 ;; KEYWORDS: frames, hypermedia | |
7 ;; | |
8 ;; AUTHOR: Bob Weiner | |
9 ;; ORG: Brown U. | |
10 ;; | |
11 ;; ORIG-DATE: 15-Mar-89 | |
12 ;; LAST-MOD: 14-Apr-95 at 16:26:27 by Bob Weiner | |
13 ;; | |
14 ;; This file is part of Hyperbole. | |
15 ;; Available for use and distribution under the same terms as GNU Emacs. | |
16 ;; | |
17 ;; Copyright (C) 1989-1995, Free Software Foundation, Inc. | |
18 ;; Developed with support from Motorola Inc. | |
19 ;; | |
20 ;; DESCRIPTION: | |
21 ;; | |
22 ;; This library provides two unrelated means of managing window | |
23 ;; configurations, (the set of windows and associated buffers within a | |
24 ;; frame). The first means associates a name with each stored window | |
25 ;; configuration. The name can then be used to retrieve the window | |
26 ;; configuration later. The following functions provide this behavior: | |
27 ;; | |
28 ;; wconfig-add-by-name | |
29 ;; wconfig-delete-by-name | |
30 ;; wconfig-restore-by-name | |
31 ;; | |
32 ;; The second means of window configuration management is through the use | |
33 ;; of a ring structure, just like the Emacs kill ring except the elements | |
34 ;; stored are window configurations instead of textual regions. The | |
35 ;; following functions support storage and sequential retrieval of window | |
36 ;; configurations: | |
37 ;; | |
38 ;; wconfig-ring-save | |
39 ;; wconfig-yank-pop | |
40 ;; wconfig-delete-pop | |
41 ;; | |
42 ;; None of this information is stored between Emacs sessions, so your | |
43 ;; window configurations will last only through a single session of use. | |
44 ;; | |
45 ;; Based in part on kill-ring code from simple.el. | |
46 ;; | |
47 ;; DESCRIP-END. | |
48 | |
49 ;;; ************************************************************************ | |
50 ;;; Recommended key bindings | |
51 ;;; ************************************************************************ | |
52 | |
53 ;;; Set up in local "hyperbole.el". | |
54 | |
55 ;;; ************************************************************************ | |
56 ;;; Other required Elisp libraries | |
57 ;;; ************************************************************************ | |
58 (require 'hargs) | |
59 (require 'set) | |
60 | |
61 ;;; ************************************************************************ | |
62 ;;; Public variables | |
63 ;;; ************************************************************************ | |
64 | |
65 (defconst wconfig-ring-max 10 | |
66 "*Maximum length of window configuration ring before oldest elements are deleted.") | |
67 | |
68 ;;; ************************************************************************ | |
69 ;;; Public functions | |
70 ;;; ************************************************************************ | |
71 | |
72 ;;; Handling of name associations with each stored window configuration. | |
73 ;;;###autoload | |
74 (defun wconfig-add-by-name (name) | |
75 "Saves the current window configuration under the string NAME. | |
76 When called interactively and a window configuration already exists under | |
77 NAME, confirms whether or not to replace it." | |
78 (interactive "sName for current window configuration: ") | |
79 (or (stringp name) | |
80 (error "(wconfig-add-by-name): NAME argument is not a string: %s" name)) | |
81 (let ((set:equal-op (function (lambda (key elt) | |
82 (equal key (car elt)))))) | |
83 (if (or (not (interactive-p)) | |
84 (not (set:member name wconfig-names)) | |
85 (y-or-n-p | |
86 (format "Replace existing '%s' window configuration: " name))) | |
87 (progn (setq wconfig-names | |
88 (set:replace name (current-window-configuration) | |
89 wconfig-names)) | |
90 (if (interactive-p) | |
91 (message "Window configuration '%s' saved. Use 'wconfig-restore-by-name' to restore." name)))))) | |
92 | |
93 ;;;###autoload | |
94 (defun wconfig-delete-by-name (name) | |
95 "Deletes window configuration saved under NAME." | |
96 (interactive (list (hargs:read-match "Delete window configuration named: " | |
97 wconfig-names nil t))) | |
98 (or (stringp name) | |
99 (error "(wconfig-delete-by-name): NAME argument is not a string: %s" name)) | |
100 (let ((set:equal-op (function (lambda (key elt) | |
101 (equal key (car elt)))))) | |
102 (setq wconfig-names (set:remove name wconfig-names)))) | |
103 | |
104 ;;;###autoload | |
105 (defun wconfig-restore-by-name (name) | |
106 "Restores window configuration saved under NAME." | |
107 (interactive (list (hargs:read-match "Restore window configuration named: " | |
108 wconfig-names nil t))) | |
109 (or (stringp name) | |
110 (error "(wconfig-restore-by-name): NAME argument is not a string: %s" name)) | |
111 (let ((wconfig (set:get name wconfig-names))) | |
112 (if wconfig | |
113 (set-window-configuration wconfig) | |
114 (error "(wconfig-restore-by-name): No window configuration named '%s'" name)))) | |
115 | |
116 ;;; Window configuration ring management (like text kill ring). | |
117 ;;;###autoload | |
118 (defun wconfig-delete-pop () | |
119 "Replaces current window config with most recently saved config in ring. | |
120 Then deletes this new configuration from the ring." | |
121 (interactive) | |
122 (if (not wconfig-ring) | |
123 (error "(wconfig-delete-pop): Window configuration save ring is empty") | |
124 (set-window-configuration (car wconfig-ring)) | |
125 (and (eq wconfig-ring wconfig-ring-yank-pointer) | |
126 (setq wconfig-ring-yank-pointer (cdr wconfig-ring))) | |
127 (setq wconfig-ring (cdr wconfig-ring)))) | |
128 | |
129 ;;;###autoload | |
130 (defun wconfig-ring-save () | |
131 "Saves the current window configuration onto the save ring. | |
132 Use {\\[wconfig-yank-pop]} to restore it at a later time." | |
133 (interactive) | |
134 (setq wconfig-ring (cons (current-window-configuration) wconfig-ring)) | |
135 (if (> (length wconfig-ring) wconfig-ring-max) | |
136 (setcdr (nthcdr (1- wconfig-ring-max) wconfig-ring) nil)) | |
137 (setq wconfig-ring-yank-pointer wconfig-ring) | |
138 (wconfig-rotate-yank-pointer (1- (length wconfig-ring-yank-pointer))) | |
139 (if (interactive-p) | |
140 (message | |
141 "Window configuration saved. Use 'wconfig-yank-pop' to restore."))) | |
142 | |
143 (defun wconfig-rotate-yank-pointer (arg) | |
144 "Rotates the yanking point prefix ARG elements in the window configuration save ring. | |
145 Interactively, default value of ARG = 1." | |
146 (interactive "p") | |
147 (let ((length (length wconfig-ring))) | |
148 (if (zerop length) | |
149 (error "(wconfig-rotate-yank-pointer): Window configuration save ring is empty") | |
150 (setq wconfig-ring-yank-pointer | |
151 (nthcdr (% (+ arg (- length (length wconfig-ring-yank-pointer))) | |
152 length) | |
153 wconfig-ring))))) | |
154 | |
155 ;;;###autoload | |
156 (defun wconfig-yank-pop (n) | |
157 "Replaces current window config with prefix arg Nth prior one in save ring. | |
158 Interactively, default value of N = 1, meaning the last saved window | |
159 configuration is displayed. | |
160 | |
161 The sequence of window configurations wraps around, so that after the oldest | |
162 one comes the newest one." | |
163 (interactive "p") | |
164 (wconfig-rotate-yank-pointer n) | |
165 (set-window-configuration (car wconfig-ring-yank-pointer))) | |
166 | |
167 ;;; ************************************************************************ | |
168 ;;; Private variables | |
169 ;;; ************************************************************************ | |
170 | |
171 (defvar wconfig-names (set:create) | |
172 "Set of (name . window-configuration) elements.") | |
173 | |
174 (defvar wconfig-ring nil | |
175 "List of window configurations saved in a ring.") | |
176 | |
177 (defvar wconfig-ring-yank-pointer nil | |
178 "The tail of the window configuration ring whose car is the last thing yanked.") | |
179 | |
180 (run-hooks 'wconfig-load-hook) | |
181 | |
182 (provide 'wconfig) |