changeset 99664:77d381812b04

(three-step-help): Remove * from defcustom. (make-help-screen): Don't iconify selected frame. (Bug#1322) Use when instead of if and cond within condition-case.
author Martin Rudalics <rudalics@gmx.at>
date Mon, 17 Nov 2008 10:07:06 +0000
parents 4600bcdbc24b
children e745add95bee
files lisp/help-macro.el
diffstat 1 files changed, 113 insertions(+), 110 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/help-macro.el	Mon Nov 17 09:58:50 2008 +0000
+++ b/lisp/help-macro.el	Mon Nov 17 10:07:06 2008 +0000
@@ -71,11 +71,11 @@
 
 ;;;###autoload
 (defcustom three-step-help nil
-  "*Non-nil means give more info about Help command in three steps.
-The three steps are simple prompt, prompt with all options,
-and window listing and describing the options.
-A value of nil means skip the middle step, so that
-\\[help-command] \\[help-command] gives the window that lists the options."
+  "Non-nil means give more info about Help command in three steps.
+The three steps are simple prompt, prompt with all options, and
+window listing and describing the options.
+A value of nil means skip the middle step, so that \\[help-command] \\[help-command]
+gives the window that lists the options."
   :type 'boolean
   :group 'help)
 
@@ -88,113 +88,116 @@
 with the key sequence that invoked FNAME.
 When FNAME finally does get a command, it executes that command
 and then returns."
- (let ((doc-fn (intern (concat (symbol-name fname) "-doc"))))
-  `(progn
-    (defun ,doc-fn () ,help-text)
-    (defun ,fname ()
-	   "Help command."
-	   (interactive)
-	   (let ((line-prompt
-		  (substitute-command-keys ,help-line)))
-	     (if three-step-help
-		 (message "%s" line-prompt))
-	     (let* ((help-screen (documentation (quote ,doc-fn)))
-		    ;; We bind overriding-local-map for very small
-		    ;; sections, *excluding* where we switch buffers
-		    ;; and where we execute the chosen help command.
-		    (local-map (make-sparse-keymap))
-		    (new-minor-mode-map-alist minor-mode-map-alist)
-		    (prev-frame (selected-frame))
-		    config new-frame key char)
-	       (if (string-match "%THIS-KEY%" help-screen)
-		   (setq help-screen
-			 (replace-match (key-description (substring (this-command-keys) 0 -1))
-					t t help-screen)))
-	       (unwind-protect
-		   (let ((minor-mode-map-alist nil))
-		     (setcdr local-map ,helped-map)
-		     (define-key local-map [t] 'undefined)
-		     ;; Make the scroll bar keep working normally.
-		     (define-key local-map [vertical-scroll-bar]
-		       (lookup-key global-map [vertical-scroll-bar]))
-		     (if three-step-help
-			 (progn
-			   (setq key (let ((overriding-local-map local-map))
-				       (read-key-sequence nil)))
-			   ;; Make the HELP key translate to C-h.
-			   (if (lookup-key function-key-map key)
-			       (setq key (lookup-key function-key-map key)))
-			   (setq char (aref key 0)))
-		       (setq char ??))
-		     (if (or (eq char ??) (eq char help-char)
+  (let ((doc-fn (intern (concat (symbol-name fname) "-doc"))))
+    `(progn
+       (defun ,doc-fn () ,help-text)
+       (defun ,fname ()
+	 "Help command."
+	 (interactive)
+	 (let ((line-prompt
+		(substitute-command-keys ,help-line)))
+	   (when three-step-help
+	     (message "%s" line-prompt))
+	   (let* ((help-screen (documentation (quote ,doc-fn)))
+		  ;; We bind overriding-local-map for very small
+		  ;; sections, *excluding* where we switch buffers
+		  ;; and where we execute the chosen help command.
+		  (local-map (make-sparse-keymap))
+		  (new-minor-mode-map-alist minor-mode-map-alist)
+		  (prev-frame (selected-frame))
+		  config new-frame key char)
+	     (when (string-match "%THIS-KEY%" help-screen)
+	       (setq help-screen
+		     (replace-match (key-description
+				     (substring (this-command-keys) 0 -1))
+				    t t help-screen)))
+	     (unwind-protect
+		 (let ((minor-mode-map-alist nil))
+		   (setcdr local-map ,helped-map)
+		   (define-key local-map [t] 'undefined)
+		   ;; Make the scroll bar keep working normally.
+		   (define-key local-map [vertical-scroll-bar]
+		     (lookup-key global-map [vertical-scroll-bar]))
+		   (if three-step-help
+		       (progn
+			 (setq key (let ((overriding-local-map local-map))
+				     (read-key-sequence nil)))
+			 ;; Make the HELP key translate to C-h.
+			 (if (lookup-key function-key-map key)
+			     (setq key (lookup-key function-key-map key)))
+			 (setq char (aref key 0)))
+		     (setq char ??))
+		   (when (or (eq char ??) (eq char help-char)
 			     (memq char help-event-list))
-			 (progn
-			   (setq config (current-window-configuration))
-			   (switch-to-buffer-other-window "*Help*")
-			   (and (fboundp 'make-frame)
-				(not (eq (window-frame (selected-window))
-					 prev-frame))
-				(setq new-frame (window-frame (selected-window))
-				      config nil))
-			   (setq buffer-read-only nil)
-			   (let ((inhibit-read-only t))
-			     (erase-buffer)
-			     (insert help-screen))
-			   (let ((minor-mode-map-alist new-minor-mode-map-alist))
-			     (help-mode)
-			     (setq new-minor-mode-map-alist minor-mode-map-alist))
-			   (goto-char (point-min))
-			   (while (or (memq char (append help-event-list
-							 (cons help-char '(?? ?\C-v ?\s ?\177 delete backspace vertical-scroll-bar ?\M-v))))
-				      (eq (car-safe char) 'switch-frame)
-				      (equal key "\M-v"))
-			     (condition-case nil
-				 (progn
-				   (if (eq (car-safe char) 'switch-frame)
-				       (handle-switch-frame char))
-				   (if (memq char '(?\C-v ?\s))
-				       (scroll-up))
-				   (if (or (memq char '(?\177 ?\M-v
-							delete backspace))
-					   (equal key "\M-v"))
-				       (scroll-down)))
-			       (error nil))
-			     (let ((cursor-in-echo-area t)
-				   (overriding-local-map local-map))
-			       (setq key (read-key-sequence
-					  (format "Type one of the options listed%s: "
-						  (if (pos-visible-in-window-p
-						       (point-max))
-						      "" ", or SPACE or DEL to scroll")))
-				     char (aref key 0)))
+		     (setq config (current-window-configuration))
+		     (switch-to-buffer-other-window "*Help*")
+		     (and (fboundp 'make-frame)
+			  (not (eq (window-frame (selected-window))
+				   prev-frame))
+			  (setq new-frame (window-frame (selected-window))
+				config nil))
+		     (setq buffer-read-only nil)
+		     (let ((inhibit-read-only t))
+		       (erase-buffer)
+		       (insert help-screen))
+		     (let ((minor-mode-map-alist new-minor-mode-map-alist))
+		       (help-mode)
+		       (setq new-minor-mode-map-alist minor-mode-map-alist))
+		     (goto-char (point-min))
+		     (while (or (memq char (append help-event-list
+						   (cons help-char '(?? ?\C-v ?\s ?\177 delete backspace vertical-scroll-bar ?\M-v))))
+				(eq (car-safe char) 'switch-frame)
+				(equal key "\M-v"))
+		       (condition-case nil
+			   (cond
+			    ((eq (car-safe char) 'switch-frame)
+			     (handle-switch-frame char))
+			    ((memq char '(?\C-v ?\s))
+			     (scroll-up))
+			    ((or (memq char '(?\177 ?\M-v delete backspace))
+				 (equal key "\M-v"))
+			     (scroll-down)))
+			 (error nil))
+		       (let ((cursor-in-echo-area t)
+			     (overriding-local-map local-map))
+			 (setq key (read-key-sequence
+				    (format "Type one of the options listed%s: "
+					    (if (pos-visible-in-window-p
+						 (point-max))
+						"" ", or SPACE or DEL to scroll")))
+			       char (aref key 0)))
 
-			     ;; If this is a scroll bar command, just run it.
-			     (when (eq char 'vertical-scroll-bar)
-			       (command-execute (lookup-key local-map key) nil key)))))
-		     ;; We don't need the prompt any more.
-		     (message "")
-		     ;; 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 (lookup-key local-map key)))
-			 (if defn
-			     (progn
-			       (if config
-				   (progn
-				     (set-window-configuration config)
-				     (setq config nil)))
-			       (if new-frame
-				   (progn (iconify-frame new-frame)
-					  (setq new-frame nil)))
-			       (call-interactively defn))
-			   (ding)))))
-		 (if new-frame (iconify-frame new-frame))
-		 (if config
-		     (set-window-configuration config))
-		 (setq minor-mode-map-alist new-minor-mode-map-alist))))))))
+		       ;; If this is a scroll bar command, just run it.
+		       (when (eq char 'vertical-scroll-bar)
+			 (command-execute (lookup-key local-map key) nil key))))
+		   ;; We don't need the prompt any more.
+		   (message "")
+		   ;; 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 (lookup-key local-map key)))
+		       (if defn
+			   (progn
+			     (when config
+			       (set-window-configuration config)
+			       (setq config nil))
+			     ;; `defn' must make sure that its frame is
+			     ;; selected, so we won't iconify it below.
+			     (call-interactively defn)
+			     (when new-frame
+			       ;; Do not iconify the selected frame.
+			       (unless (eq new-frame (selected-frame))
+				 (iconify-frame new-frame))
+			       (setq new-frame nil)))
+			 (ding)))))
+	       (when config
+		 (set-window-configuration config))
+	       (when new-frame
+		 (iconify-frame new-frame))
+	       (setq minor-mode-map-alist new-minor-mode-map-alist))))))))
 
 (provide 'help-macro)