annotate lisp/behavior.el @ 5569:d19b6e3bdf91

#'cl-defsubst-expand; avoid mutually-recursive symbol macros. lisp/ChangeLog addition: 2011-09-10 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (cl-defsubst-expand): Change set 2a6a8da4dd7c of http://mid.gmane.org/19966.17522.332164.615228@parhasard.net wasn't sufficiently comprehensive, symbol macros can be mutually rather than simply recursive, and they can equally hang. Thanks for the bug report, Michael Sperber, and for the test case, Stephen Turnbull.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 10 Sep 2011 13:17:29 +0100
parents e05d98bf9644
children 5d3bb1100832
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
1 ;;; behavior.el --- consistent interface onto packages
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
2
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
3 ;; Copyright (C) 2000, 2001, 2002, 2003 Ben Wing.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
4
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
5 ;; Author: Ben Wing
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
6 ;; Maintainer: XEmacs Development Team
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
7 ;; Keywords: internal, dumped
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
8
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
9 ;; This file is part of XEmacs.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
10
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5271
diff changeset
11 ;; XEmacs is free software: you can redistribute it and/or modify it
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5271
diff changeset
12 ;; under the terms of the GNU General Public License as published by the
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5271
diff changeset
13 ;; Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5271
diff changeset
14 ;; option) any later version.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
15
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5271
diff changeset
16 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5271
diff changeset
17 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5271
diff changeset
18 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5271
diff changeset
19 ;; for more details.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
20
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5271
diff changeset
22 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
23
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
24 ;;; Synched up with: Not in FSF.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
25
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
26 ;;; Authorship:
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
27
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
28 ;; Created July 2000 by Ben Wing.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
29
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
30 ;;; Commentary:
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
31
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
32 ;; This file is dumped with XEmacs.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
33
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
34 ;; This file is part of the "Behaviors" project and is a work in progress.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
35 ;; The purpose of the project is to provide (a) a consistent interface (at
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
36 ;; the API level) onto the functionality provided by packages, and (b) an
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
37 ;; easy-to-use user interface for this functionality, something that
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
38 ;; *really works*.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
39 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
40 ;; First, what characteristics do/should packages have? (NOTE: In this
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
41 ;; discussion below, `package' and `behavior' are being used more or less
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
42 ;; interchangeably. Eventually this will get resolved.)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
43
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
44 ;; 1) A file, or one or more file, containing the code of the package. In
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
45 ;; addition, a "head" file in the case that the package needs to be
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
46 ;; loaded in order to get its functionality (e.g. "load-to-enable"
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
47 ;; packages -- an abomination that is tolerated only with severe
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
48 ;; displeasure).
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
49 ;; 2) A Lisp name -- a fairly short symbol (2-3 words max), uncapitalized,
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
50 ;; without use of excessive abbreviation and with words set off by
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
51 ;; dashes. This should be the same as the name of the topmost custom
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
52 ;; group associated with the package (see next item), and preferably the
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
53 ;; same as the common prefix used for variables defined by your package
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
54 ;; and the name of the head file of the package.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
55 ;; 3) Associated custom group listing the settings associated with the package.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
56 ;; 4) Enable and disable methods for turning on or off the functionality of
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
57 ;; the package, if it's amenable to such a model. Most packages are of two
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
58 ;; types:
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
59 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
60 ;; (a) They add some functionality to XEmacs, which is incorporated
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
61 ;; into and makes changes to the normal functionality of XEmacs. Once the
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
62 ;; package is enabled, the user doesn't have to do anything specific for
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
63 ;; the package to do its thing -- it happens automatically if the user is
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
64 ;; using the area whose behavior has been changed. These include packages
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
65 ;; such as `avoid' (which makes the mouse poointer move when the cursor
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
66 ;; gets too close), EFS (which adds the ability to treat an FTP site as
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
67 ;; part of the local file system), the packages that supply the
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
68 ;; mode-specific handling for various files, etc
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
69 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
70 ;; (b) They provide functionality in the form of specific command to be
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
71 ;; invoked. This can be as simple as the `hippie-expand' command (tries
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
72 ;; lots of different expansion methods for the text before point, to
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
73 ;; try and get a result) and as complicated as GNUS or VM.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
74 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
75 ;; Some packages might provide both -- you can enable them and they
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
76 ;; incorporate some functionality into the XEmacs base, but while
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
77 ;; they're enabled they provide certain commands. #### We need some
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
78 ;; thought here, and case-by-case analysis, to determine if this really
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
79 ;; makes sense -- can the enable/disable be removed and whatever needs
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
80 ;; to happen incorporated as part of the command? can the
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
81 ;; enable/disable just added to the commands?
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
82 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
83 ;; 5) Packages of type (b) just above will have a list of commands that can be
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
84 ;; run. They should be in standard menubar format -- i.e. just like a
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
85 ;; submenu, but without the initial string indidicating the name of the
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
86 ;; menu.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
87 ;; 6) Short doc string, for use in a menu item. *NOT* necessarily the same
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
88 ;; as the documentation for the Custom group, which is often too long.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
89 ;; 7) Long documentation.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
90 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
91 ;; Good package etiquette:
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
92 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
93 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
94 ;; -- Never mess with the menu yourself, or try to "cheat" by putting yourself
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
95 ;; high up in the hierarchy, e.g. at the top-level or directly off a
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
96 ;; top-level group that expects to contain only groups of groups, not
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
97 ;; end-level groups.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
98 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
99 ;; -- Never use the `override-behavior' commands or the like for specifying
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
100 ;; (in an overriding fashion) the exact appearance of the hierarchies.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
101 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
102 ;; -- For type (a), with enable/disable methods:
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
103 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
104 ;; (a) Loading the file should NOT DO ANYTHING. Not enable, not add hooks,
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
105 ;; nothing.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
106 ;; (b) Both enable and disable hooks must exist. The disable hook must
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
107 ;; completely reset the environment to how it was before the package
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
108 ;; was enabled. This includes restoring the prior bindings for
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
109 ;; modified key bindings. #### We need some helper function to assist
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
110 ;; with remembering the old key bindings and putting them back only
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
111 ;; when new key bindings haven't been made -- but recognize when those
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
112 ;; new key bondings were attached as a result of loading another
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
113 ;; package, so that after any order of loading and unloading a series
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
114 ;; of packages, the original bindings will eventually occur. (Something
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
115 ;; like `advice' for key definitions.) Replacement of functions should
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
116 ;; happen through `advice'.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
117 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
118 ;; We recognize that many packages out there don't follow these precepts at
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
119 ;; all. Many or most of them are install-only, often happening
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
120 ;; automatically when the file is loaded. Converting these will be a step
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
121 ;; at a time: First, redo the latter type so that the initialization code
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
122 ;; is put into a function and not run automatically upon load. Next step,
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
123 ;; try to provide some sort of disable. Third step, work on making sure
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
124 ;; that disable removes *everything* and enable puts it all back. Fourth
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
125 ;; step, work on properly advising keys and functions.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
126 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
127
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
128 ;; Comparison/Integration with Custom:
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
129
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
130 ;; Custom only handles variable settings, and has no concept of standard
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
131 ;; enable/disable methods for a package, a standard way of specifying
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
132 ;; package documentation, or a list of commands associated with a package.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
133 ;; Also, its groups do not always map very well onto packages and the
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
134 ;; resulting hierarchy is too big, confusing, difficult-to-navigate, and
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
135 ;; incoherent. More generally it does not address at all the basic problem
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
136 ;; that a hierarchy created in a decentralized fashion -- and by a large
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
137 ;; number of authors, some more competent than others -- will inevitably be
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
138 ;; incoherent when put together.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
139 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
140
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
141 ;; In general, ease-of-use was not the overarching goal of Custom. The
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
142 ;; primary goal of Custom seems to have been to provide a consistent interface
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
143 ;; and get all the packages to use it. Ease-of-use -- or even following
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
144 ;; established user-interface standards -- has taken a far-distant second, and
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
145 ;; appears in many respects to be an afterthought that never had any serious
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
146 ;; effort investigated into it.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
147 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
148 ;; The eventual intent of this project is to integrate with custom. The final
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
149 ;; intent of integration is that this project subsumes Custom completely,
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
150 ;; making Custom the unified, user-friendly means of controlling XEmacs that
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
151 ;; has never properly existed. However, that will take a lot of work. For
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
152 ;; the meantime, the plan is to develop the Behavior subsystem independent of
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
153 ;; Custom, with ease-of-use as the primary goal, and get it to the point where
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
154 ;; it encompasses most packages out there, has stabilized its interface, and
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
155 ;; works well. At that point, we will consider integration with Custom. (Note
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
156 ;; that the hard part of the Behavior work is not actually behaviorizing the
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
157 ;; packages, but developing the interface itself.)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
158 ;;
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
159 ;; As for integrating with Custom -- ideally that would mean simply extending
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
160 ;; defgroup, but that is not really possible given that backward-compatibility
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
161 ;; would not work -- existing versions of `defgroup' give an error when
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
162 ;; presented with an unknown keyword. In practice, then, this might mean that
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
163 ;; a separate `define-behavior' command (or `defpackage', or the like) will
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
164 ;; still exist.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
165
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
166 ;;; Code:
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
167
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
168 ;; Hash table mapping behavior names to property lists, with entries for
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
169 ;; :group, :custom-group, :short-doc, :require, :enable, :disable,
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
170 ;; and :commands.
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
171 (defconst behavior-hash-table (make-hash-table))
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
172 ;; Hash table mapping groups to property lists (entries for :group, :children,
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
173 ;; :short-doc).
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
174 (defconst behavior-group-hash-table (make-hash-table))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
175 ;; Hash table with override information for groups.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
176 ;; :short-doc).
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
177 (defconst behavior-override-hash-table (make-hash-table))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
178
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
179 (defvar within-behavior-enabling-disabling nil)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
180
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
181 (defgroup behaviors nil
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
182 "Behaviors -- high-level functionality interface.")
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
183
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
184 ;; List of enabled behaviors.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
185 (defcustom enabled-behavior-list nil
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
186 "List of currently enabled behaviors.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
187 Normally, don't set it directly; use `enable-behavior' or `disable-behavior'."
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
188 :initialize #'set-default
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
189 :set #'(lambda (sym val)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
190 (if within-behavior-enabling-disabling
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
191 (set sym val)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
192 (let* ((old-val enabled-behavior-list)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
193 (disable-list (set-difference old-val val))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
194 (enable-list (set-difference val old-val)))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
195 (dolist (b disable-list)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
196 (disable-behavior b t))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
197 (dolist (b enable-list)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
198 (enable-behavior b t))
897
7da79fbe37bb [xemacs-hg @ 2002-07-02 19:09:22 by stephent]
stephent
parents: 800
diff changeset
199 (assert (equal (sort (copy-sequence enabled-behavior-list) 'string-lessp)
7da79fbe37bb [xemacs-hg @ 2002-07-02 19:09:22 by stephent]
stephent
parents: 800
diff changeset
200 (sort (copy-sequence val) 'string-lessp))))))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
201 :type '(repeat (symbol :tag "Behavior"))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
202 :group 'behaviors)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
203
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
204
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
205 (defvar behavior-history nil
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
206 "History of entered behaviors.")
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
207
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
208 (defun behavior-group-p (group)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
209 "Non-nil if GROUP is the name of a valid behavior group."
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
210 (not (null (gethash group behavior-group-hash-table))))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
211
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
212 (defun check-behavior-group (group)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
213 "Verify that GROUP is a valid behavior group, or nil.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
214 Return GROUP if so."
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
215 (or (behavior-group-p group)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
216 (error 'invalid-argument "Invalid behavior group" group))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
217 group)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
218
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
219 (defun* define-behavior (name doc-string &key
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
220 group custom-group
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
221 (short-doc
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
222 (capitalize-string-as-title
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
223 (replace-in-string (symbol-name name) "-" " ")))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
224 require enable disable commands
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
225 &allow-other-keys)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
226 ;; We allow other keys to allow for the possibility of extensions by
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
227 ;; later versions of XEmacs. Packages should be able to support those
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
228 ;; extensions without worrying about causing problems with older versions
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
229 ;; of XEmacs.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
230 "Define a behavior named NAME.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
231 DOC-STRING must be specified, a description of what the behavior does
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
232 when it's enabled and how to further control it (typically through
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
233 custom variables). Accepted keywords are
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
234
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
235 :group Symbol naming the behavior group this behavior is within.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
236 :custom-group Symbol naming the custom group containing the options that
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
237 can be set in association with this behavior. If not specified,
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
238 the custom group with the same name as the behavior will be
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
239 used, if it exists.
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
240 :short-doc A \"pretty\" version of the name, for use in menus. If omitted
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
241 a prettified name will be generated.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
242 :require A single symbol or a list of such symbols, which need to be
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
243 present at enable time, or will be loaded using `require'.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
244 :enable A function of no variables, which turns the behavior on.
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
245 :disable A function of no variables, which turns the behavior off.
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
246 :commands A list of interactive commands that can be invoked in
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
247 conjunction with the behavior. These will appear in a submenu
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
248 along with the rest of the items for the behavior.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
249
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
250 Behaviors are assumed to be global, and to take effect immediately; if
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
251 the underlying package is per-buffer, it may have to scan all existing
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
252 buffers and frob them. When a behavior is disabled, it should completely
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
253 go away *everywhere*, as if it were never invoked at all.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
254
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
255 The :disable keyword can be missing, although this is considered bad
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
256 practice. In such a case, attempting to disable the behavior will signal
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
257 an error unless you use the `force' option.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
258
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
259 The :enable keyword can be missing. This is useful for behaviors that
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
260 are really a series of related commands without anything semantically
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
261 corresponding to \"turning on\" or \"turning off\" the behavior.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
262
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
263 A behavior with no :enable and no :command is possible. This might be
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
264 used, for example, by a behavior that encapsulates a series of related
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
265 Lisp functions. Such behaviors may be handled specially, e.g. not
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
266 displayed in the menus or displayed in a separate location, since they
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
267 have no user-invocable behavior."
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
268 (let ((entry (list :group (check-behavior-group group)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
269 :custom-group custom-group
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
270 :short-doc short-doc :require require
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
271 :enable enable :disable disable
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
272 :commands commands)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
273 (puthash name entry behavior-hash-table))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
274 ;; update the children list of the group we're in (maybe nil).
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
275 (unless (member name (getf (gethash group behavior-group-hash-table)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
276 :children))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
277 (push name (getf (gethash group behavior-group-hash-table) :children))))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
278
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
279 (defun* override-behavior (name &key
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
280 short-doc
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
281 group
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
282 include
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
283 demote-others)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
284 "Override the default properties of a behavior group NAME.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
285 Normally, groups are created and assigned properties by individual packages.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
286 The resulting hierarchy may not make much sense globally. This function
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
287 allows the hierarchy and appearance of a group to be specified globally,
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
288 and will take precendence over the properties assigned by `define-behavior-group'. This allows a global organization to be imposed on groups, while still allowing for graceful handling of new or unknown groups.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
289
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
290 NAME can be a symbol specifying a group name, or a list of
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
291 \(PARENT [...] NAME), where a path from a particular parent is explicitly
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
292 given. (This latter form allows the same name to be assigned to more than one
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
293 group.)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
294
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
295 Accepted keywords are
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
296
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
297 :short-doc A \"pretty\" version of the name, for use in menus.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
298 :group Parent group, if any. Should not be given if the parents are
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
299 explicitly specified in NAME.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
300 :include A list of behaviors that are specifically included in this
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
301 group, in addition to those that are included by the behaviors
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
302 themselves.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
303 :demote-others If non-nil, exclude all behaviors not specified in the :include
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
304 list and put them instead (i.e. \"demote\" them) to another group,
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
305 usually a subgroup."
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
306 (let ((entry (list :group (check-behavior-group group)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
307 :short-doc short-doc
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
308 :include include
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
309 :demote-others demote-others)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
310 (puthash name entry behavior-override-hash-table)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
311
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
312 (defun* define-behavior-group (name &key
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
313 (short-doc
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
314 (capitalize-string-as-title
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
315 (replace-in-string (symbol-name name) "-"
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
316 " ")))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
317 group)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
318 "Define a behavior group NAME.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
319
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
320 NAME can be a symbol specifying a group name, or a list of
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
321 \(PARENT [...] NAME), where a path from a particular parent is explicitly
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
322 given. (This latter form allows the same name to be assigned to more than one
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
323 group.)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
324
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
325 Accepted keywords are
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
326
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
327 :short-doc A \"pretty\" version of the name, for use in menus. If omitted
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
328 a prettified name will be generated.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
329 :group Parent group, if any. Should not be given if the parents are
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
330 explicitly specified in NAME."
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
331 (let ((entry (list :group (check-behavior-group group)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
332 :short-doc short-doc)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
333 (puthash name entry behavior-group-hash-table))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
334 ;; update the children list of the parent (maybe nil).
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
335 (push name (getf (gethash group behavior-group-hash-table) :children)))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
336
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
337 (defun read-behavior (prompt &optional must-match initial-contents history
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
338 default-value)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
339 "Return a behavior symbol from the minibuffer, prompting with string PROMPT.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
340 If non-nil, optional second arg INITIAL-CONTENTS is a string to insert
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
341 in the minibuffer before reading.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
342 Third arg HISTORY, if non-nil, specifies a history list. (It defaults to
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
343 `behavior-history'.)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
344 Fourth arg DEFAULT-VALUE is the default value. If non-nil, it is used
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
345 for history command, and as the value to return if the user enters the
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
346 empty string."
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
347 (let ((result
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
348 (completing-read
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
349 prompt
5271
2def0d83a5e3 Don't uselessly call #'nreverse, #'hash-table-key-list and friends.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4372
diff changeset
350 (let (list)
2def0d83a5e3 Don't uselessly call #'nreverse, #'hash-table-key-list and friends.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4372
diff changeset
351 (maphash #'(lambda (key value)
2def0d83a5e3 Don't uselessly call #'nreverse, #'hash-table-key-list and friends.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4372
diff changeset
352 (push (cons (symbol-name key) value) list))
2def0d83a5e3 Don't uselessly call #'nreverse, #'hash-table-key-list and friends.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4372
diff changeset
353 behavior-hash-table)
2def0d83a5e3 Don't uselessly call #'nreverse, #'hash-table-key-list and friends.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4372
diff changeset
354 list)
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
355 nil must-match initial-contents (or history 'behavior-history)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
356 default-value)))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
357 (if (and result (stringp result))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
358 (intern result)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
359 result)))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
360
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
361 (defun behavior-enabled-p (behavior)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
362 "Non-nil if BEHAVIOR (a symbol) if currently enabled."
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
363 (memq behavior enabled-behavior-list))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
364
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
365 (defun enable-behavior (behavior &optional force)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
366 "Enable the specified behavior."
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
367 (interactive (list (read-behavior "Enable Behavior: " t) current-prefix-arg))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
368 (let ((plist (gethash behavior behavior-hash-table)))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
369 (or plist (error 'invalid-argument "Not a behavior" behavior))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
370 (or force (not (memq behavior enabled-behavior-list))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
371 (error 'invalid-change "Behavior already enabled" behavior))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
372 (let ((require (getf plist :require))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
373 (enable (getf plist :enable)))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
374 (cond ((listp require)
5524
e05d98bf9644 Style and indentation corrections, behavior.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
375 (mapc 'require require))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
376 ((symbolp require)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
377 (require require))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
378 (t (error 'invalid-argument "Invalid :require spec" require)))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
379 (message "Enabling behavior %s..." behavior)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
380 (if enable (funcall enable))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
381 (message "Enabling behavior %s...done" behavior)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
382 (let ((within-behavior-enabling-disabling t))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
383 (customize-set-variable 'enabled-behavior-list
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
384 (cons behavior enabled-behavior-list))))))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
385
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
386 (defun disable-behavior (behavior &optional force)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
387 "Disable the specified behavior."
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
388 (interactive (list (read-behavior "Disable Behavior: " t)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
389 current-prefix-arg))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
390 (let ((plist (gethash behavior behavior-hash-table)))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
391 (or plist (error 'invalid-argument "Not a behavior" behavior))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
392 (or force (memq behavior enabled-behavior-list)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
393 (error 'invalid-change "Behavior not enabled" behavior))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
394 (let ((require (getf plist :require))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
395 (disable (getf plist :disable)))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
396 (cond ((listp require)
5524
e05d98bf9644 Style and indentation corrections, behavior.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
397 (mapc 'require require))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
398 ((symbolp require)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
399 (require require))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
400 (t (error 'invalid-argument "Invalid :require spec" require)))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
401 (message "Disabling behavior %s..." behavior)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
402 (if disable (funcall disable))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
403 (message "Disabling behavior %s...done" behavior)
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
404 (let ((within-behavior-enabling-disabling t))
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
405 (customize-set-variable 'enabled-behavior-list
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 502
diff changeset
406 (delq behavior enabled-behavior-list))))))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
407
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
408 (defun compute-behavior-group-children (group hash)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
409 "Compute the actual children for GROUP and its subgroups.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
410 This takes into account the override information specified."
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
411 (let* ((group-plist (gethash group behavior-group-hash-table))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
412 (override (gethash group behavior-override-hash-table))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
413 (children (getf group-plist :children)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
414 )
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
415 )
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
416
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
417 (defun behavior-menu-filter-1 (menu group)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
418 (submenu-generate-accelerator-spec
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
419 (let* (
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
420 ;;options
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
421 ;;help
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
422 (enable
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
423 (menu-split-long-menu
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
424 (menu-sort-menu
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
425 (let ((group-plist (gethash group behavior-group-hash-table)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
426 (loop for behavior in (getf group-plist :children)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
427 nconc (if (behavior-group-p behavior)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
428 (list
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
429 (cons (getf
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
430 (gethash behavior behavior-group-hash-table)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
431 :short-doc)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
432 (behavior-menu-filter-1 menu behavior)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
433 (let* ((plist (gethash behavior behavior-hash-table))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
434 (commands (getf plist :commands)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
435 (nconc
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
436 (if (getf plist :enable)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
437 `([,(format "%s (%s) [toggle]"
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
438 (getf plist :short-doc)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
439 behavior)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
440 (if (memq ',behavior
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
441 enabled-behavior-list)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
442 (disable-behavior ',behavior)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
443 (enable-behavior ',behavior))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
444 :active ,(if (getf plist :disable) t
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
445 (not (memq
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
446 ',behavior
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
447 enabled-behavior-list)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
448 :style toggle
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
449 :selected (memq ',behavior
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
450 enabled-behavior-list)]))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
451 (cond ((null commands) nil)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
452 ((and (eq (length commands) 1)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
453 (vectorp (elt commands 0)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
454 (let ((comm (copy-sequence
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
455 (elt commands 0))))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
456 (setf (elt comm 0)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
457 (format "%s (%s)"
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
458 (elt comm 0) behavior))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
459 (list comm)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
460 (t (list
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
461 (cons (format "%s (%s) Commands"
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
462 (getf plist :short-doc)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
463 behavior)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
464 commands)))))))))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
465 ))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
466 )
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
467 )
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
468 enable)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
469 '(?p)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
470
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
471 (defun behavior-menu-filter (menu)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
472 (append
4372
ebb35ddea76a Byte-compile menu lambdas; make the menu of available tutorials more readable.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2546
diff changeset
473 `(("%_Package Utilities"
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
474 ("%_Set Download Site"
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
475 ("%_Official Releases"
4372
ebb35ddea76a Byte-compile menu lambdas; make the menu of available tutorials more readable.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2546
diff changeset
476 :filter ,#'(lambda (&rest junk)
5524
e05d98bf9644 Style and indentation corrections, behavior.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
477 (menu-split-long-menu
e05d98bf9644 Style and indentation corrections, behavior.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
478 (submenu-generate-accelerator-spec
e05d98bf9644 Style and indentation corrections, behavior.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
479 (package-ui-download-menu)))))
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
480 ("%_Pre-Releases"
4372
ebb35ddea76a Byte-compile menu lambdas; make the menu of available tutorials more readable.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2546
diff changeset
481 :filter ,#'(lambda (&rest junk)
ebb35ddea76a Byte-compile menu lambdas; make the menu of available tutorials more readable.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2546
diff changeset
482 (menu-split-long-menu
ebb35ddea76a Byte-compile menu lambdas; make the menu of available tutorials more readable.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2546
diff changeset
483 (submenu-generate-accelerator-spec
ebb35ddea76a Byte-compile menu lambdas; make the menu of available tutorials more readable.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2546
diff changeset
484 (package-ui-pre-release-download-menu)))))
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
485 ("%_Site Releases"
4372
ebb35ddea76a Byte-compile menu lambdas; make the menu of available tutorials more readable.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2546
diff changeset
486 :filter ,#'(lambda (&rest junk)
ebb35ddea76a Byte-compile menu lambdas; make the menu of available tutorials more readable.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2546
diff changeset
487 (menu-split-long-menu
ebb35ddea76a Byte-compile menu lambdas; make the menu of available tutorials more readable.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2546
diff changeset
488 (submenu-generate-accelerator-spec
ebb35ddea76a Byte-compile menu lambdas; make the menu of available tutorials more readable.
Aidan Kehoe <kehoea@parhasard.net>
parents: 2546
diff changeset
489 (package-ui-site-release-download-menu))))))
2546
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
490 "--:shadowEtchedIn"
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
491 ["%_Update Package Index" package-get-update-base]
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
492 ["%_List and Install" pui-list-packages]
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
493 ["U%_pdate Installed Packages" package-get-update-all]
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
494 ["%_Help" (Info-goto-node "(xemacs)Packages")])
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
495 "----")
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
496 (behavior-menu-filter-1 menu nil)))
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
497
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
498 ;; Initialize top-level group.
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
499 (puthash nil '(:children nil :short-doc "Root") behavior-group-hash-table)
5d1743698fb3 [xemacs-hg @ 2005-02-03 05:26:39 by ben]
ben
parents: 1346
diff changeset
500
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
501 (provide 'behavior)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents:
diff changeset
503 ;;; finder-inf.el ends here