help-macro.el 5.26 KB
Newer Older
1
;;; help-macro.el --- Makes command line help such as help-for-help
Eric S. Raymond's avatar
Eric S. Raymond committed
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

;; Copyright (C) 1993 Free Software Foundation, Inc.

;; Author: Lynn Slater <lrs@indetech.com>
;; Created: : Mon Oct  1 11:42:39 1990
;; Adapted-By: ESR
;; Last Modified By: Lynn Slater x2048
;; Last Modified On: Mon Sep 23 14:40:19 1991

;; This file is part of GNU Emacs.

;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to
;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

;;; Commentary:
;;
;; 	This file supplies the macro make-help-screen which constructs
;; single character dispatching with browsable help such as that provided
;; by help-for-help. This can be used to make many modes easier to use; for
;; example, the Gnu Emacs Empire Tool uses this for every "nested" mode map
;; called from the main mode map.

35 36 37
;;       The name of this package was changed from help-screen.el to
;; help-macro.el in order to fit in a 14-character limit.

Eric S. Raymond's avatar
Eric S. Raymond committed
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
;;-> ***********************  Example of use *********************************

;;->(make-help-screen help-for-empire-redistribute-map
;;->		  "c:civ m:mil p:population f:food ?"
;;->		  "You have discovered the GEET redistribution commands
;;->   From here, you can use the following options:
;;->
;;->c	Redistribute civs from overfull sectors into connected underfull ones
;;->	  The functions typically named by empire-ideal-civ-fcn control
;;->          based in part on empire-sector-civ-threshold  
;;->m	Redistribute military using levels given by empire-ideal-mil-fcn
;;->p	Redistribute excess population to highways for max pop growth
;;->	  Excess is any sector so full babies will not be born.
;;->f	Even out food on highways to highway min and leave levels
;;->	  This is good to pump max food to all warehouses/dist pts
;;->
;;->
;;->Use \\[help-for-empire-redistribute-map] for help on redistribution.
;;->Use \\[help-for-empire-extract-map] for help on data extraction.
;;->Please use \\[describe-key] to find out more about any of the other keys."
;;->		  empire-shell-redistribute-map)

;;->  (define-key c-mp "\C-h" 'help-for-empire-redistribute-map)
;;->  (define-key c-mp help-character 'help-for-empire-redistribute-map)

;;; Change Log:
;;
;; 22-Jan-1991		Lynn Slater x2048	
;;    Last Modified: Mon Oct  1 11:43:52 1990 #3 (Lynn Slater)
;;    documented better

;;; Code:

71
(provide 'help-macro)
Eric S. Raymond's avatar
Eric S. Raymond committed
72 73 74
(require 'backquote)

(defmacro make-help-screen (fname help-line help-text helped-map)
75 76 77 78 79 80
  "Construct help-menu function name FNAME.
When invoked, FNAME shows HELP-LINE and reads a command using HELPED-MAP.
If the command is the help character is requested, FNAME displays HELP-TEXT
and continues trying to read a command using HELPED-MAP.
When FNAME finally does get a command, it executes that command
and then returns."
Eric S. Raymond's avatar
Eric S. Raymond committed
81 82 83 84
  (` (defun (, fname) ()
	   (, help-text)
	   (interactive)
	   (let ((line-prompt
85
		  (substitute-command-keys (, help-line))))
Eric S. Raymond's avatar
Eric S. Raymond committed
86
	     (message line-prompt)
87 88 89
	     (let* ((overriding-local-map (make-sparse-keymap))
		    (minor-mode-map-alist nil)
		    config key char help-screen)
90 91
	       (unwind-protect
		   (progn
92 93 94
		     (setcdr overriding-local-map (, helped-map))
		     (define-key overriding-local-map [t] 'undefined)
		     (setq help-screen (documentation (quote (, fname))))
95 96
		     (setq key (read-key-sequence nil))
		     (setq char (aref key 0))
97 98 99 100 101
		     (if (or (eq char ??) (eq char help-char))
			 (progn
			   (setq config (current-window-configuration))
			   (switch-to-buffer-other-window "*Help*")
			   (erase-buffer)
102
			   (insert help-screen)
103
			   (goto-char (point-min))
104 105 106
			   (while (or (memq char (cons help-char '(?? ?\C-v ?\ ?\177 ?\M-v)))
				      (equal key "\M-v"))
			     (setq list (cons key list))
107 108 109 110
			     (condition-case nil
				 (progn
				   (if (memq char '(?\C-v ?\ ))
				       (scroll-up))
111 112
				   (if (or (memq char '(?\177 ?\M-v))
					   (equal key "\M-v"))
113 114
				       (scroll-down)))
			       (error nil))
115 116 117 118 119
			     (message "%s%s: "
				      line-prompt
				      (if (pos-visible-in-window-p (point-max))
					  "" " or Space to scroll"))
			     (let ((cursor-in-echo-area t))
120
			       (setq key (read-key-sequence nil)
121 122
				     char (aref key 0))))
			   (setq list (cons key list))))
123 124 125 126 127 128 129 130 131 132 133 134 135
		     ;; Mouse clicks are not part of the help feature,
		     ;; so reexecute them in the standard environment.
		     (if (listp char)
			 (setq unread-command-events
			       (cons char unread-command-events)
			       config nil)
		       (let ((defn (key-binding key)))
			 (if defn
			     (progn
			       (if config
				   (progn
				     (set-window-configuration config)
				     (setq config nil)))
136
			       (setq overriding-local-map nil)
137
			       (call-interactively defn))
138 139 140
			   (ding)))))
		 (if config
		     (set-window-configuration config))))))
Eric S. Raymond's avatar
Eric S. Raymond committed
141 142
     ))

143
;;; help-macro.el
Eric S. Raymond's avatar
Eric S. Raymond committed
144