Don't capitalize custom group name.
[bpt/emacs.git] / lisp / help-macro.el
CommitLineData
3aee11cd 1;;; help-macro.el --- Makes command line help such as help-for-help
465fceed 2
d733c5ec 3;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
465fceed
ER
4
5;; Author: Lynn Slater <lrs@indetech.com>
4228277d 6;; Maintainer: FSF
465fceed
ER
7;; Created: : Mon Oct 1 11:42:39 1990
8;; Adapted-By: ESR
465fceed
ER
9
10;; This file is part of GNU Emacs.
11
12;; GNU Emacs is free software; you can redistribute it and/or modify
13;; it under the terms of the GNU General Public License as published by
14;; the Free Software Foundation; either version 2, or (at your option)
15;; any later version.
16
17;; GNU Emacs is distributed in the hope that it will be useful,
18;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20;; GNU General Public License for more details.
21
22;; You should have received a copy of the GNU General Public License
b578f267
EN
23;; along with GNU Emacs; see the file COPYING. If not, write to the
24;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
25;; Boston, MA 02111-1307, USA.
465fceed
ER
26
27;;; Commentary:
b578f267
EN
28
29;; This file supplies the macro make-help-screen which constructs
465fceed
ER
30;; single character dispatching with browsable help such as that provided
31;; by help-for-help. This can be used to make many modes easier to use; for
32;; example, the Gnu Emacs Empire Tool uses this for every "nested" mode map
33;; called from the main mode map.
34
3aee11cd
ER
35;; The name of this package was changed from help-screen.el to
36;; help-macro.el in order to fit in a 14-character limit.
37
465fceed
ER
38;;-> *********************** Example of use *********************************
39
40;;->(make-help-screen help-for-empire-redistribute-map
41;;-> "c:civ m:mil p:population f:food ?"
42;;-> "You have discovered the GEET redistribution commands
43;;-> From here, you can use the following options:
44;;->
45;;->c Redistribute civs from overfull sectors into connected underfull ones
46;;-> The functions typically named by empire-ideal-civ-fcn control
47;;-> based in part on empire-sector-civ-threshold
48;;->m Redistribute military using levels given by empire-ideal-mil-fcn
49;;->p Redistribute excess population to highways for max pop growth
50;;-> Excess is any sector so full babies will not be born.
51;;->f Even out food on highways to highway min and leave levels
52;;-> This is good to pump max food to all warehouses/dist pts
53;;->
54;;->
55;;->Use \\[help-for-empire-redistribute-map] for help on redistribution.
56;;->Use \\[help-for-empire-extract-map] for help on data extraction.
57;;->Please use \\[describe-key] to find out more about any of the other keys."
58;;-> empire-shell-redistribute-map)
59
60;;-> (define-key c-mp "\C-h" 'help-for-empire-redistribute-map)
61;;-> (define-key c-mp help-character 'help-for-empire-redistribute-map)
62
63;;; Change Log:
64;;
65;; 22-Jan-1991 Lynn Slater x2048
66;; Last Modified: Mon Oct 1 11:43:52 1990 #3 (Lynn Slater)
67;; documented better
68
69;;; Code:
70
dd6a74ce 71(provide 'help-macro)
465fceed
ER
72(require 'backquote)
73
d189e346
RS
74;;;###autoload
75(defvar three-step-help nil
76 "*Non-nil means give more info about Help command in three steps.
77The three steps are simple prompt, prompt with all options,
78and window listing and describing the options.
79A value of nil means skip the middle step, so that
80\\[help-command] \\[help-command] gives the window that lists the options.")
81
465fceed 82(defmacro make-help-screen (fname help-line help-text helped-map)
657a7909
RS
83 "Construct help-menu function name FNAME.
84When invoked, FNAME shows HELP-LINE and reads a command using HELPED-MAP.
e31e7d37 85If the command is the help character, FNAME displays HELP-TEXT
657a7909 86and continues trying to read a command using HELPED-MAP.
527a0902
RS
87If HELP-TEXT contains the sequence `%THIS-KEY%', that is replaced
88with the key sequence that invoked FNAME.
657a7909
RS
89When FNAME finally does get a command, it executes that command
90and then returns."
527a0902
RS
91 (let ((doc-fn (intern (concat (symbol-name fname) "-doc"))))
92 `(progn
93 (defun ,doc-fn () ,help-text)
94 (defun ,fname ()
95 "Help command."
465fceed
ER
96 (interactive)
97 (let ((line-prompt
527a0902 98 (substitute-command-keys ,help-line)))
d189e346 99 (if three-step-help
7e6fe07f 100 (message "%s" line-prompt))
527a0902 101 (let* ((help-screen (documentation (quote ,doc-fn)))
aaa99cbe
RS
102 ;; We bind overriding-local-map for very small
103 ;; sections, *excluding* where we switch buffers
104 ;; and where we execute the chosen help command.
105 (local-map (make-sparse-keymap))
ee18da58 106 (minor-mode-map-alist nil)
8d2b0a2d
RS
107 (prev-frame (selected-frame))
108 config new-frame key char)
527a0902
RS
109 (if (string-match "%THIS-KEY%" help-screen)
110 (setq help-screen
111 (replace-match (key-description (substring (this-command-keys) 0 -1))
112 t t help-screen)))
c968e96c
RS
113 (unwind-protect
114 (progn
527a0902 115 (setcdr local-map ,helped-map)
aaa99cbe 116 (define-key local-map [t] 'undefined)
cb80240a
RS
117 ;; Make the scroll bar keep working normally.
118 (define-key local-map [vertical-scroll-bar]
119 (lookup-key global-map [vertical-scroll-bar]))
d189e346 120 (if three-step-help
8902ae9e
RS
121 (progn
122 (setq key (let ((overriding-local-map local-map))
123 (read-key-sequence nil)))
124 ;; Make the HELP key translate to C-h.
125 (if (lookup-key function-key-map key)
126 (setq key (lookup-key function-key-map key)))
127 (setq char (aref key 0)))
d189e346 128 (setq char ??))
873dd80b
RS
129 (if (or (eq char ??) (eq char help-char)
130 (memq char help-event-list))
c968e96c
RS
131 (progn
132 (setq config (current-window-configuration))
133 (switch-to-buffer-other-window "*Help*")
8fdae34a
RS
134 (and (fboundp 'make-frame)
135 (not (eq (window-frame (selected-window))
136 prev-frame))
137 (setq new-frame (window-frame (selected-window))
138 config nil))
d40bbdb5 139 (setq buffer-read-only nil)
c968e96c 140 (erase-buffer)
657a7909 141 (insert help-screen)
05d688cf 142 (help-mode)
c968e96c 143 (goto-char (point-min))
873dd80b 144 (while (or (memq char (append help-event-list
cb80240a 145 (cons help-char '(?? ?\C-v ?\ ?\177 delete backspace vertical-scroll-bar ?\M-v))))
8d2b0a2d 146 (eq (car-safe char) 'switch-frame)
ee18da58 147 (equal key "\M-v"))
657a7909
RS
148 (condition-case nil
149 (progn
8d2b0a2d
RS
150 (if (eq (car-safe char) 'switch-frame)
151 (handle-switch-frame char))
657a7909
RS
152 (if (memq char '(?\C-v ?\ ))
153 (scroll-up))
873dd80b
RS
154 (if (or (memq char '(?\177 ?\M-v
155 delete backspace))
ee18da58 156 (equal key "\M-v"))
657a7909
RS
157 (scroll-down)))
158 (error nil))
aaa99cbe
RS
159 (let ((cursor-in-echo-area t)
160 (overriding-local-map local-map))
d189e346
RS
161 (setq key (read-key-sequence
162 (format "Type one of the options listed%s: "
163 (if (pos-visible-in-window-p
164 (point-max))
693caa71 165 "" ", or SPACE or DEL to scroll")))
cb80240a
RS
166 char (aref key 0)))
167
168 ;; If this is a scroll bar command, just run it.
169 (when (eq char 'vertical-scroll-bar)
170 (command-execute (lookup-key local-map key) nil key)))))
43462d5b
RS
171 ;; We don't need the prompt any more.
172 (message "")
657a7909
RS
173 ;; Mouse clicks are not part of the help feature,
174 ;; so reexecute them in the standard environment.
175 (if (listp char)
176 (setq unread-command-events
177 (cons char unread-command-events)
178 config nil)
7ffbe7e2 179 (let ((defn (lookup-key local-map key)))
657a7909
RS
180 (if defn
181 (progn
182 (if config
183 (progn
184 (set-window-configuration config)
185 (setq config nil)))
8d2b0a2d
RS
186 (if new-frame
187 (progn (iconify-frame new-frame)
188 (setq new-frame nil)))
657a7909 189 (call-interactively defn))
c968e96c 190 (ding)))))
8d2b0a2d 191 (if new-frame (iconify-frame new-frame))
c968e96c
RS
192 (if config
193 (set-window-configuration config))))))
527a0902 194 )))
465fceed 195
3aee11cd 196;;; help-macro.el
465fceed 197