| 12
 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
 35
 36
 37
 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
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 
 | ;;; helper.el --- utility help package supporting help in electric modes
;; Copyright (C) 1985 Free Software Foundation, Inc.
;; Author: K. Shane Hartman
;; Maintainer: FSF
;; Keywords: help
;; This file is part of XEmacs.
;; XEmacs 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.
;; XEmacs 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 XEmacs; see the file COPYING.  If not, write to the Free
;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
;; 02111-1307, USA.
;;; Synched up with: FSF 19.34.
;;; Code:
;; hey, here's a helping hand.
;; Bind this to a string for <blank> in "... Other keys <blank>".
;; Helper-help uses this to construct help string when scrolling.
;; Defaults to "return"
(defvar Helper-return-blurb nil)
;; Keymap implementation doesn't work too well for non-standard loops.
;; But define it anyway for those who can use it.  Non-standard loops
;; will probably have to use Helper-help.  You can't autoload the
;; keymap either.
(defvar Helper-help-map nil)
(if Helper-help-map
    nil
  (setq Helper-help-map (make-keymap))
  ;(fillarray Helper-help-map 'undefined)
  (define-key Helper-help-map "m" 'Helper-describe-mode)
  (define-key Helper-help-map "b" 'Helper-describe-bindings)
  (define-key Helper-help-map "c" 'Helper-describe-key-briefly)
  (define-key Helper-help-map "k" 'Helper-describe-key)
  ;(define-key Helper-help-map "f" 'Helper-describe-function)
  ;(define-key Helper-help-map "v" 'Helper-describe-variable)
  (define-key Helper-help-map "?" 'Helper-help-options)
  (define-key Helper-help-map (vector help-char) 'Helper-help-options)
  (fset 'Helper-help-map Helper-help-map))
(defun Helper-help-scroller ()
  (let ((blurb (or (and (boundp 'Helper-return-blurb)
			Helper-return-blurb)
		   "return")))
    (save-window-excursion
      (goto-char (window-start (selected-window)))
      (if (get-buffer-window "*Help*")
	  (pop-to-buffer "*Help*")
	(switch-to-buffer "*Help*"))
      (goto-char (point-min))
      (let ((continue t) state)
	(while continue
	  (setq state (+ (* 2 (if (pos-visible-in-window-p (point-max)) 1 0))
			 (if (pos-visible-in-window-p (point-min)) 1 0)))
	  (message
	    (nth state
		 '("Space forward, Delete back. Other keys %s"
		   "Space scrolls forward. Other keys %s"
		   "Delete scrolls back. Other keys %s"
		   "Type anything to %s"))
	    blurb)
	  (setq continue (read-char))
	  (cond ((and (memq continue '(?\ ?\C-v)) (< state 2))
		 (scroll-up))
		((= continue ?\C-l)
		 (recenter))
		((and (= continue ?\177) (zerop (% state 2)))
		 (scroll-down))
		(t (setq continue nil))))))))
(defun Helper-help-options ()
  "Describe help options."
  (interactive)
  (message "c (key briefly), m (mode), k (key), b (bindings)")
  ;(message "c (key briefly), m (mode), k (key), v (variable), f (function)")
  (sit-for 4))
(defun Helper-describe-key-briefly (key)
  "Briefly describe binding of KEY."
  (interactive "kDescribe key briefly: ")
  (describe-key-briefly key)
  (sit-for 4))
(defun Helper-describe-key (key)
  "Describe binding of KEY."
  (interactive "kDescribe key: ")
  (save-window-excursion (describe-key key))
  (Helper-help-scroller))
(defun Helper-describe-function ()
  "Describe a function.  Name read interactively."
  (interactive)
  (save-window-excursion (call-interactively 'describe-function))
  (Helper-help-scroller))
(defun Helper-describe-variable ()
  "Describe a variable.  Name read interactively."
  (interactive)
  (save-window-excursion (call-interactively 'describe-variable))
  (Helper-help-scroller))
(defun Helper-describe-mode ()
  "Describe the current mode."
  (interactive)
  (let ((name mode-name)
	(documentation (documentation major-mode)))
    (save-excursion
      (set-buffer (get-buffer-create "*Help*"))
      (erase-buffer)
      (insert name " Mode\n" documentation)
      (help-mode)))
  (Helper-help-scroller))
;;;###autoload
(defun Helper-describe-bindings ()
  "Describe local key bindings of current mode."
  (interactive)
  (message "Making binding list...")
  (save-window-excursion (describe-bindings))
  (Helper-help-scroller))
;;;###autoload
(defun Helper-help ()
  "Provide help for current mode."
  (interactive)
  (let ((continue t) c)
    (while continue
      (message "Help (Type ? for further options)")
      (setq c (read-key-sequence nil))
      (setq c (lookup-key Helper-help-map c))
      (cond ((eq c 'Helper-help-options)
	     (Helper-help-options))
	    ((commandp c)
	     (call-interactively c)
	     (setq continue nil))
	    (t
	     (ding)
	     (setq continue nil))))))
(provide 'helper)
;;; helper.el ends here
 |