Clarify initial discussion.
[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
2ebf3469 47;;-> based in part on empire-sector-civ-threshold
465fceed
ER
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;;
2ebf3469 65;; 22-Jan-1991 Lynn Slater x2048
465fceed
ER
66;; Last Modified: Mon Oct 1 11:43:52 1990 #3 (Lynn Slater)
67;; documented better
68
69;;; Code:
70
465fceed
ER
71(require 'backquote)
72
d189e346 73;;;###autoload
2ebf3469 74(defcustom three-step-help nil
d189e346
RS
75 "*Non-nil means give more info about Help command in three steps.
76The three steps are simple prompt, prompt with all options,
77and window listing and describing the options.
78A value of nil means skip the middle step, so that
2ebf3469
DL
79\\[help-command] \\[help-command] gives the window that lists the options."
80 :type 'boolean
81 :group 'help)
d189e346 82
465fceed 83(defmacro make-help-screen (fname help-line help-text helped-map)
657a7909
RS
84 "Construct help-menu function name FNAME.
85When invoked, FNAME shows HELP-LINE and reads a command using HELPED-MAP.
e31e7d37 86If the command is the help character, FNAME displays HELP-TEXT
657a7909 87and continues trying to read a command using HELPED-MAP.
527a0902
RS
88If HELP-TEXT contains the sequence `%THIS-KEY%', that is replaced
89with the key sequence that invoked FNAME.
657a7909
RS
90When FNAME finally does get a command, it executes that command
91and then returns."
527a0902
RS
92 (let ((doc-fn (intern (concat (symbol-name fname) "-doc"))))
93 `(progn
94 (defun ,doc-fn () ,help-text)
95 (defun ,fname ()
96 "Help command."
465fceed
ER
97 (interactive)
98 (let ((line-prompt
527a0902 99 (substitute-command-keys ,help-line)))
d189e346 100 (if three-step-help
7e6fe07f 101 (message "%s" line-prompt))
527a0902 102 (let* ((help-screen (documentation (quote ,doc-fn)))
aaa99cbe
RS
103 ;; We bind overriding-local-map for very small
104 ;; sections, *excluding* where we switch buffers
105 ;; and where we execute the chosen help command.
106 (local-map (make-sparse-keymap))
ee18da58 107 (minor-mode-map-alist nil)
8d2b0a2d
RS
108 (prev-frame (selected-frame))
109 config new-frame key char)
527a0902
RS
110 (if (string-match "%THIS-KEY%" help-screen)
111 (setq help-screen
112 (replace-match (key-description (substring (this-command-keys) 0 -1))
113 t t help-screen)))
c968e96c
RS
114 (unwind-protect
115 (progn
527a0902 116 (setcdr local-map ,helped-map)
aaa99cbe 117 (define-key local-map [t] 'undefined)
cb80240a
RS
118 ;; Make the scroll bar keep working normally.
119 (define-key local-map [vertical-scroll-bar]
120 (lookup-key global-map [vertical-scroll-bar]))
d189e346 121 (if three-step-help
8902ae9e
RS
122 (progn
123 (setq key (let ((overriding-local-map local-map))
124 (read-key-sequence nil)))
125 ;; Make the HELP key translate to C-h.
126 (if (lookup-key function-key-map key)
127 (setq key (lookup-key function-key-map key)))
128 (setq char (aref key 0)))
d189e346 129 (setq char ??))
873dd80b
RS
130 (if (or (eq char ??) (eq char help-char)
131 (memq char help-event-list))
c968e96c
RS
132 (progn
133 (setq config (current-window-configuration))
134 (switch-to-buffer-other-window "*Help*")
8fdae34a
RS
135 (and (fboundp 'make-frame)
136 (not (eq (window-frame (selected-window))
137 prev-frame))
138 (setq new-frame (window-frame (selected-window))
139 config nil))
d40bbdb5 140 (setq buffer-read-only nil)
c968e96c 141 (erase-buffer)
657a7909 142 (insert help-screen)
05d688cf 143 (help-mode)
c968e96c 144 (goto-char (point-min))
873dd80b 145 (while (or (memq char (append help-event-list
cb80240a 146 (cons help-char '(?? ?\C-v ?\ ?\177 delete backspace vertical-scroll-bar ?\M-v))))
8d2b0a2d 147 (eq (car-safe char) 'switch-frame)
ee18da58 148 (equal key "\M-v"))
657a7909
RS
149 (condition-case nil
150 (progn
8d2b0a2d
RS
151 (if (eq (car-safe char) 'switch-frame)
152 (handle-switch-frame char))
657a7909
RS
153 (if (memq char '(?\C-v ?\ ))
154 (scroll-up))
873dd80b
RS
155 (if (or (memq char '(?\177 ?\M-v
156 delete backspace))
ee18da58 157 (equal key "\M-v"))
657a7909
RS
158 (scroll-down)))
159 (error nil))
aaa99cbe
RS
160 (let ((cursor-in-echo-area t)
161 (overriding-local-map local-map))
d189e346
RS
162 (setq key (read-key-sequence
163 (format "Type one of the options listed%s: "
164 (if (pos-visible-in-window-p
165 (point-max))
693caa71 166 "" ", or SPACE or DEL to scroll")))
cb80240a
RS
167 char (aref key 0)))
168
169 ;; If this is a scroll bar command, just run it.
170 (when (eq char 'vertical-scroll-bar)
171 (command-execute (lookup-key local-map key) nil key)))))
43462d5b
RS
172 ;; We don't need the prompt any more.
173 (message "")
657a7909
RS
174 ;; Mouse clicks are not part of the help feature,
175 ;; so reexecute them in the standard environment.
176 (if (listp char)
177 (setq unread-command-events
178 (cons char unread-command-events)
179 config nil)
7ffbe7e2 180 (let ((defn (lookup-key local-map key)))
657a7909
RS
181 (if defn
182 (progn
183 (if config
184 (progn
185 (set-window-configuration config)
186 (setq config nil)))
8d2b0a2d
RS
187 (if new-frame
188 (progn (iconify-frame new-frame)
189 (setq new-frame nil)))
657a7909 190 (call-interactively defn))
c968e96c 191 (ding)))))
8d2b0a2d 192 (if new-frame (iconify-frame new-frame))
c968e96c
RS
193 (if config
194 (set-window-configuration config))))))
527a0902 195 )))
465fceed 196
2ebf3469 197(provide 'help-macro)
465fceed 198
2ebf3469 199;;; help-macro.el ends here