Switch to recommended form of GPLv3 permissions notice.
[bpt/emacs.git] / lisp / help-macro.el
CommitLineData
55535639 1;;; help-macro.el --- makes command line help such as help-for-help
465fceed 2
c90f2757 3;; Copyright (C) 1993, 1994, 2001, 2002, 2003, 2004,
409cc4a3 4;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
465fceed
ER
5
6;; Author: Lynn Slater <lrs@indetech.com>
4228277d 7;; Maintainer: FSF
55535639 8;; Created: Mon Oct 1 11:42:39 1990
465fceed 9;; Adapted-By: ESR
465fceed
ER
10
11;; This file is part of GNU Emacs.
12
eb3fa2cf 13;; GNU Emacs is free software: you can redistribute it and/or modify
465fceed 14;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
15;; the Free Software Foundation, either version 3 of the License, or
16;; (at your option) any later version.
465fceed
ER
17
18;; GNU Emacs is distributed in the hope that it will be useful,
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
22
23;; You should have received a copy of the GNU General Public License
eb3fa2cf 24;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
465fceed
ER
25
26;;; Commentary:
b578f267
EN
27
28;; This file supplies the macro make-help-screen which constructs
465fceed
ER
29;; single character dispatching with browsable help such as that provided
30;; by help-for-help. This can be used to make many modes easier to use; for
55535639 31;; example, the GNU Emacs Empire Tool uses this for every "nested" mode map
465fceed
ER
32;; called from the main mode map.
33
3aee11cd
ER
34;; The name of this package was changed from help-screen.el to
35;; help-macro.el in order to fit in a 14-character limit.
36
465fceed
ER
37;;-> *********************** Example of use *********************************
38
39;;->(make-help-screen help-for-empire-redistribute-map
40;;-> "c:civ m:mil p:population f:food ?"
41;;-> "You have discovered the GEET redistribution commands
42;;-> From here, you can use the following options:
43;;->
44;;->c Redistribute civs from overfull sectors into connected underfull ones
45;;-> The functions typically named by empire-ideal-civ-fcn control
2ebf3469 46;;-> based in part on empire-sector-civ-threshold
465fceed
ER
47;;->m Redistribute military using levels given by empire-ideal-mil-fcn
48;;->p Redistribute excess population to highways for max pop growth
49;;-> Excess is any sector so full babies will not be born.
50;;->f Even out food on highways to highway min and leave levels
51;;-> This is good to pump max food to all warehouses/dist pts
52;;->
53;;->
54;;->Use \\[help-for-empire-redistribute-map] for help on redistribution.
55;;->Use \\[help-for-empire-extract-map] for help on data extraction.
56;;->Please use \\[describe-key] to find out more about any of the other keys."
57;;-> empire-shell-redistribute-map)
58
59;;-> (define-key c-mp "\C-h" 'help-for-empire-redistribute-map)
60;;-> (define-key c-mp help-character 'help-for-empire-redistribute-map)
61
62;;; Change Log:
63;;
2ebf3469 64;; 22-Jan-1991 Lynn Slater x2048
465fceed
ER
65;; Last Modified: Mon Oct 1 11:43:52 1990 #3 (Lynn Slater)
66;; documented better
67
68;;; Code:
69
465fceed
ER
70(require 'backquote)
71
d189e346 72;;;###autoload
2ebf3469 73(defcustom three-step-help nil
d189e346
RS
74 "*Non-nil means give more info about Help command in three steps.
75The three steps are simple prompt, prompt with all options,
76and window listing and describing the options.
77A value of nil means skip the middle step, so that
2ebf3469
DL
78\\[help-command] \\[help-command] gives the window that lists the options."
79 :type 'boolean
80 :group 'help)
d189e346 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))
ef8f2df6 123 (read-key-sequence nil)))
8902ae9e
RS
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)
cd2768dd
JL
140 (let ((inhibit-read-only t))
141 (erase-buffer)
142 (insert help-screen))
05d688cf 143 (help-mode)
c968e96c 144 (goto-char (point-min))
873dd80b 145 (while (or (memq char (append help-event-list
f4ae0b8b 146 (cons help-char '(?? ?\C-v ?\s ?\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))
5949f098 153 (if (memq char '(?\C-v ?\s))
657a7909 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
cbee283d 199;; arch-tag: 59fee949-1686-485a-8a05-83418073e257
2ebf3469 200;;; help-macro.el ends here