(ispell-local-dictionary-alist): Add
[bpt/emacs.git] / lisp / help.el
index 770bcab..fc43d8d 100644 (file)
@@ -1,6 +1,6 @@
 ;;; help.el --- help commands for Emacs
 
-;; Copyright (C) 1985, 1986, 1993, 1994, 1998, 1999, 2000, 2001, 2002
+;; Copyright (C) 1985, 1986, 1993, 1994, 1998, 1999, 2000, 2001, 2002, 2004
 ;;   Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
@@ -49,6 +49,7 @@
 (define-key help-map (char-to-string help-char) 'help-for-help)
 (define-key help-map [help] 'help-for-help)
 (define-key help-map [f1] 'help-for-help)
+(define-key help-map "." 'display-local-help)
 (define-key help-map "?" 'help-for-help)
 
 (define-key help-map "\C-c" 'describe-copying)
@@ -177,7 +178,7 @@ If FUNCTION is nil, it applies `message', thus displaying the message."
 
 (defalias 'help 'help-for-help)
 (make-help-screen help-for-help
-  "a b c C e f F i I k C-k l L m p s t v w C-c C-d C-f C-n C-p C-t C-w or ? :"
+  "a b c C e f F i I k C-k l L m p s t v w C-c C-d C-f C-n C-p C-t C-w or ? :"
   "You have typed %THIS-KEY%, the help character.  Type a Help option:
 \(Use SPC or DEL to scroll through this text.  Type \\<help-map>\\[help-quit] to exit the Help command.)
 
@@ -217,6 +218,8 @@ v  describe-variable.  Type name of a variable;
        it displays the variable's documentation and value.
 w  where-is.  Type command name; it prints which keystrokes
        invoke that command.
+.  display-local-help.  Display any available local help at point
+        in the echo area.
 
 C-c Display Emacs copying permission (GNU General Public License).
 C-d Display Emacs ordering information.
@@ -310,19 +313,61 @@ of the key sequence that ran this command."
 
 (defun view-emacs-news (&optional arg)
   "Display info on recent changes to Emacs.
-With numeric argument, display information on correspondingly older changes."
+With argument, display info only for the selected version."
   (interactive "P")
-  (let* ((arg (if arg (prefix-numeric-value arg) 0))
-        (file (cond ((eq arg 0) "NEWS")
-                    ((eq arg 1) "ONEWS")
-                    (t
-                     (nth (- arg 2)
-                          (nreverse (directory-files data-directory
-                                                     nil "^ONEWS\\.[0-9]+$"
-                                                     nil)))))))
-    (if file
-       (view-file (expand-file-name file data-directory))
-      (error "No such old news"))))
+  (if (not arg)
+      (view-file (expand-file-name "NEWS" data-directory))
+    (let* ((map (sort
+                 (delete-dups
+                  (apply
+                   'nconc
+                   (mapcar
+                    (lambda (file)
+                      (with-temp-buffer
+                        (insert-file-contents
+                         (expand-file-name file data-directory))
+                        (let (res)
+                          (while (re-search-forward
+                                  (if (string-match "^ONEWS\\.[0-9]+$" file)
+                                      "Changes in \\(?:Emacs\\|version\\)?[ \t]*\\([0-9]+\\(?:\\.[0-9]+\\)?\\)"
+                                    "^\* [^0-9\n]*\\([0-9]+\\.[0-9]+\\)") nil t)
+                            (setq res (cons (list (match-string-no-properties 1)
+                                                  file) res)))
+                          res)))
+                    (append '("NEWS" "ONEWS")
+                            (directory-files data-directory nil
+                                             "^ONEWS\\.[0-9]+$" nil)))))
+                 (lambda (a b)
+                   (string< (car b) (car a)))))
+           (current (caar map))
+           (version (completing-read
+                     (format "Read NEWS for the version (default %s): " current)
+                     (mapcar 'car map) nil nil nil nil current))
+           (file (cadr (assoc version map)))
+           res)
+      (if (not file)
+          (error "No news is good news")
+        (view-file (expand-file-name file data-directory))
+        (widen)
+        (goto-char (point-min))
+        (when (re-search-forward
+               (concat (if (string-match "^ONEWS\\.[0-9]+$" file)
+                           "Changes in \\(?:Emacs\\|version\\)?[ \t]*"
+                         "^\* [^0-9\n]*") version)
+               nil t)
+          (beginning-of-line)
+          (narrow-to-region
+           (point)
+           (save-excursion
+             (while (and (setq res
+                               (re-search-forward
+                                (if (string-match "^ONEWS\\.[0-9]+$" file)
+                                    "Changes in \\(?:Emacs\\|version\\)?[ \t]*\\([0-9]+\\(?:\\.[0-9]+\\)?\\)"
+                                  "^\* [^0-9\n]*\\([0-9]+\\.[0-9]+\\)") nil t))
+                         (equal (match-string-no-properties 1) version)))
+             (or res (goto-char (point-max)))
+             (beginning-of-line)
+             (point))))))))
 
 (defun view-todo (&optional arg)
   "Display the Emacs TODO list."
@@ -561,11 +606,13 @@ the last key hit are used."
 \f
 (defun describe-mode (&optional buffer)
   "Display documentation of current major mode and minor modes.
-The major mode description comes first, followed by the minor modes,
-each on a separate page.
-For this to work correctly for a minor mode, the mode's indicator variable
-\(listed in `minor-mode-alist') must also be a function whose documentation
-describes the minor mode."
+A brief summary of the minor modes comes first, followed by the
+major mode description.  This is followed by detailed
+descriptions of the minor modes, each on a separate page.
+
+For this to work correctly for a minor mode, the mode's indicator
+variable \(listed in `minor-mode-alist') must also be a function
+whose documentation describes the minor mode."
   (interactive)
   (help-setup-xref (list #'describe-mode (or buffer (current-buffer)))
                   (interactive-p))
@@ -637,7 +684,7 @@ follows the description of the major mode.)\n\n"))
   "Display documentation of a minor mode given as MINOR-MODE.
 MINOR-MODE can be a minor mode symbol or a minor mode indicator string
 appeared on the mode-line."
-  (interactive (list (completing-read 
+  (interactive (list (completing-read
                      "Minor mode: "
                              (nconc
                               (describe-minor-mode-completion-table-for-symbol)
@@ -655,14 +702,14 @@ appeared on the mode-line."
      (t
       (error "No such minor mode: %s" minor-mode)))))
 
-;; symbol    
+;; symbol
 (defun describe-minor-mode-completion-table-for-symbol ()
   ;; In order to list up all minor modes, minor-mode-list
   ;; is used here instead of minor-mode-alist.
   (delq nil (mapcar 'symbol-name minor-mode-list)))
 (defun describe-minor-mode-from-symbol (symbol)
   "Display documentation of a minor mode given as a symbol, SYMBOL"
-  (interactive (list (intern (completing-read 
+  (interactive (list (intern (completing-read
                              "Minor mode symbol: "
                              (describe-minor-mode-completion-table-for-symbol)))))
   (if (fboundp symbol)
@@ -671,7 +718,7 @@ appeared on the mode-line."
 
 ;; indicator
 (defun describe-minor-mode-completion-table-for-indicator ()
-  (delq nil 
+  (delq nil
        (mapcar (lambda (x)
                  (let ((i (format-mode-line x)))
                    ;; remove first space if existed
@@ -680,15 +727,15 @@ appeared on the mode-line."
                      nil)
                     ((eq (aref i 0) ?\ )
                      (substring i 1))
-                    (t 
+                    (t
                      i))))
                minor-mode-alist)))
 (defun describe-minor-mode-from-indicator (indicator)
   "Display documentation of a minor mode specified by INDICATOR.
 If you call this function interactively, you can give indicator which
 is currently activated with completion."
-  (interactive (list 
-               (completing-read 
+  (interactive (list
+               (completing-read
                 "Minor mode indicator: "
                 (describe-minor-mode-completion-table-for-indicator))))
   (let ((minor-mode (lookup-minor-mode-from-indicator indicator)))
@@ -699,17 +746,17 @@ is currently activated with completion."
 (defun lookup-minor-mode-from-indicator (indicator)
   "Return a minor mode symbol from its indicator on the modeline."
   ;; remove first space if existed
-  (if (and (< 0 (length indicator)) 
+  (if (and (< 0 (length indicator))
           (eq (aref indicator 0) ?\ ))
       (setq indicator (substring indicator 1)))
   (let ((minor-modes minor-mode-alist)
        result)
     (while minor-modes
       (let* ((minor-mode (car (car minor-modes)))
-            (anindicator (format-mode-line 
+            (anindicator (format-mode-line
                           (car (cdr (car minor-modes))))))
        ;; remove first space if existed
-       (if (and (stringp anindicator) 
+       (if (and (stringp anindicator)
                 (> (length anindicator) 0)
                 (eq (aref anindicator 0) ?\ ))
            (setq anindicator (substring anindicator 1)))