(unify-8859-on-encoding-mode): Fix spellings in docstrings.
[bpt/emacs.git] / lisp / info-look.el
index 3513812..4fc2c6b 100644 (file)
@@ -1,7 +1,7 @@
 ;;; info-look.el --- major-mode-sensitive Info index lookup facility
 ;; An older version of this was known as libc.el.
 
-;; Copyright (C) 1995,96,97,98,99,2001,2003,2004  Free Software Foundation, Inc.
+;; Copyright (C) 1995,96,97,98,99,2001,03,04,05  Free Software Foundation, Inc.
 
 ;; Author: Ralph Schleicher <rs@nunatak.allgaeu.org>
 ;;         (did not show signs of life (Nov 2001)  -stef)
@@ -47,7 +47,7 @@ Automatically becomes buffer local when set in any fashion.")
   "Non-nil means pop up the Info buffer in another window."
   :group 'info-lookup :type 'boolean)
 
-(defcustom info-lookup-highlight-face 'highlight
+(defcustom info-lookup-highlight-face 'match
   "Face for highlighting looked up help items.
 Setting this variable to nil disables highlighting."
   :group 'info-lookup :type 'face)
@@ -245,6 +245,7 @@ system."
   (interactive)
   (setq info-lookup-cache nil))
 
+;;;###autoload (put 'info-lookup-symbol 'info-file "emacs")
 ;;;###autoload
 (defun info-lookup-symbol (symbol &optional mode)
   "Display the definition of SYMBOL, as found in the relevant manual.
@@ -258,6 +259,7 @@ With prefix arg a query for the symbol help mode is offered."
    (info-lookup-interactive-arguments 'symbol current-prefix-arg))
   (info-lookup 'symbol symbol mode))
 
+;;;###autoload (put 'info-lookup-file 'info-file "emacs")
 ;;;###autoload
 (defun info-lookup-file (file &optional mode)
   "Display the documentation of a file.
@@ -326,22 +328,22 @@ If optional argument QUERY is non-nil, query for the help mode."
          (modes (info-lookup->all-modes topic mode))
          (window (selected-window))
          found doc-spec node prefix suffix doc-found)
-    (if (or (not info-lookup-other-window-flag)
-           (eq (current-buffer) (get-buffer "*info*")))
-       (info)
-      (progn
-       (save-window-excursion (info))
-       ;; Determine whether or not the Info buffer is visible in
-       ;; another frame on the same display.  If it is, simply raise
-       ;; that frame.  Otherwise, display it in another window.
-       (let* ((window (get-buffer-window "*info*" t))
-              (info-frame (and window (window-frame window))))
-         (if (and info-frame
-                  (display-multi-frame-p)
-                  (memq info-frame (frames-on-display-list))
-                  (not (eq info-frame (selected-frame))))
-           (select-frame info-frame)
-         (switch-to-buffer-other-window "*info*")))))
+    (if (not (eq major-mode 'Info-mode))
+       (if (not info-lookup-other-window-flag)
+           (info)
+         (progn
+           (save-window-excursion (info))
+           ;; Determine whether or not the Info buffer is visible in
+           ;; another frame on the same display.  If it is, simply raise
+           ;; that frame.  Otherwise, display it in another window.
+           (let* ((window (get-buffer-window "*info*" t))
+                  (info-frame (and window (window-frame window))))
+             (if (and info-frame
+                      (display-multi-frame-p)
+                      (memq info-frame (frames-on-display-list))
+                      (not (eq info-frame (selected-frame))))
+                 (select-frame info-frame)
+               (switch-to-buffer-other-window "*info*"))))))
     (while (and (not found) modes)
       (setq doc-spec (info-lookup->doc-spec topic (car modes)))
       (while (and (not found) doc-spec)
@@ -408,12 +410,11 @@ If optional argument QUERY is non-nil, query for the help mode."
            (message "No %s help available for `%s'" topic mode)
          ;; Recursively setup cross references.
          ;; But refer only to non-void modes.
-         (mapcar (lambda (arg)
-                   (or (info-lookup->initialized topic arg)
-                       (info-lookup-setup-mode topic arg))
-                   (and (eq (info-lookup->initialized topic arg) t)
-                        (setq refer-modes (cons arg refer-modes))))
-                 (info-lookup->other-modes topic mode))
+         (dolist (arg (info-lookup->other-modes topic mode))
+           (or (info-lookup->initialized topic arg)
+               (info-lookup-setup-mode topic arg))
+           (and (eq (info-lookup->initialized topic arg) t)
+                (setq refer-modes (cons arg refer-modes))))
          (setq refer-modes (nreverse refer-modes))
          ;; Build the full completion alist.
          (setq completions
@@ -632,11 +633,18 @@ Return nil if there is nothing appropriate in the buffer near point."
  :mode 'c-mode :topic 'symbol
  :regexp "\\(struct \\|union \\|enum \\)?[_a-zA-Z][_a-zA-Z0-9]*"
  :doc-spec '(("(libc)Function Index" nil
-             "^[ \t]+- \\(Function\\|Macro\\): .*\\<" "\\>")
+             "^[ \t]+-+ \\(Function\\|Macro\\): .*\\<" "\\>")
+             ;; prefix/suffix has to match things like
+             ;;   " -- Macro: int F_DUPFD"
+             ;;   " -- Variable: char * tzname [2]"
+             ;;   "`DBL_MAX'"    (texinfo @table)
+             ;; suffix "\\>" is not used because that sends DBL_MAX to
+             ;; DBL_MAX_EXP ("_" is a non-word char)
             ("(libc)Variable Index" nil
-             "^[ \t]+- \\(Variable\\|Macro\\): .*\\<" "\\>")
+              "^\\([ \t]+-+ \\(Variable\\|Macro\\): .*\\<\\|`\\)"
+              "\\( \\|'?$\\)")
             ("(libc)Type Index" nil
-             "^[ \t]+- Data Type: \\<" "\\>")
+             "^[ \t]+-+ Data Type: \\<" "\\>")
             ("(termcap)Var Index" nil
              "^[ \t]*`" "'"))
  :parse-rule 'info-lookup-guess-c-symbol)
@@ -672,7 +680,7 @@ Return nil if there is nothing appropriate in the buffer near point."
              (lambda (item)
                (if (string-match "^\\([a-zA-Z]+\\|[^a-zA-Z]\\)\\( .*\\)?$" item)
                    (concat "@" (match-string 1 item))))
-             "`" "'")))
+             "`" "[' ]")))
 
 (info-lookup-maybe-add-help
  :mode 'm4-mode
@@ -689,7 +697,7 @@ Return nil if there is nothing appropriate in the buffer near point."
              ("(autoconf)Autoconf Macro Index"
               (lambda (item)
                 (if (string-match "^A._" item) item (concat "AC_" item)))
-             "^[ \t]+- \\(Macro\\|Variable\\): .*\\<" "\\>")
+             "^[ \t]+-+ \\(Macro\\|Variable\\): .*\\<" "\\>")
              ;; M4 Macro Index entries are without "AS_" prefixes, and
              ;; mostly without "m4_" prefixes.  "dnl" is an exception, not
              ;; wanting any prefix.  So AS_ is added back to upper-case
@@ -704,13 +712,13 @@ Return nil if there is nothing appropriate in the buffer near point."
                          (concat "AS_" item))
                         (t
                          (concat "m4_" item)))))
-             "^[ \t]+- Macro: .*\\<" "\\>")
+             "^[ \t]+-+ Macro: .*\\<" "\\>")
              ;; Autotest Macro Index entries are without "AT_".
              ("(autoconf)Autotest Macro Index" "AT_"
-             "^[ \t]+- Macro: .*\\<" "\\>")
+             "^[ \t]+-+ Macro: .*\\<" "\\>")
             ;; This is for older versions (probably pre autoconf 2.5x):
             ("(autoconf)Macro Index" "AC_"
-             "^[ \t]+- \\(Macro\\|Variable\\): .*\\<" "\\>")
+             "^[ \t]+-+ \\(Macro\\|Variable\\): .*\\<" "\\>")
             ;; Automake has index entries for its notes on various autoconf
             ;; macros (eg. AC_PROG_CC).  Ensure this is after the autoconf
             ;; index, so as to prefer the autoconf docs.
@@ -787,13 +795,13 @@ Return nil if there is nothing appropriate in the buffer near point."
              ;; Variables normally appear in nodes as just `foo'.
              ("(emacs)Variable Index" nil "`" "'")
              ;; Almost all functions, variables, etc appear in nodes as
-             ;; " - Function: foo" etc.  A small number of aliases and
+             ;; " -- Function: foo" etc.  A small number of aliases and
              ;; symbols appear only as `foo', and will miss out on exact
              ;; positions.  Allowing `foo' would hit too many false matches
              ;; for things that should go to Function: etc, and those latter
              ;; are much more important.  Perhaps this could change if some
              ;; sort of fallback match scheme existed.
-             ("(elisp)Index"          nil "^ - .*: " "\\( \\|$\\)")))
+             ("(elisp)Index"          nil "^ -+ .*: " "\\( \\|$\\)")))
 
 (info-lookup-maybe-add-help
  :mode 'lisp-interaction-mode
@@ -813,14 +821,14 @@ Return nil if there is nothing appropriate in the buffer near point."
  :ignore-case t
  ;; Aubrey Jaffer's rendition from <URL:ftp://ftp-swiss.ai.mit.edu/pub/scm>
  :doc-spec '(("(r5rs)Index" nil
-             "^[ \t]+- [^:]+:[ \t]*" "\\b")))
+             "^[ \t]+-+ [^:]+:[ \t]*" "\\b")))
 
 (info-lookup-maybe-add-help
  :mode 'octave-mode
  :regexp "[_a-zA-Z0-9]+"
  :doc-spec '(("(octave)Function Index" nil
-             "^ - [^:]+:[ ]+\\(\\[[^=]*=[ ]+\\)?" nil)
-            ("(octave)Variable Index" nil "^ - [^:]+:[ ]+" nil)
+             "^ -+ [^:]+:[ ]+\\(\\[[^=]*=[ ]+\\)?" nil)
+            ("(octave)Variable Index" nil "^ -+ [^:]+:[ ]+" nil)
             ;; Catch lines of the form "xyz statement"
             ("(octave)Concept Index"
              (lambda (item)
@@ -828,15 +836,15 @@ Return nil if there is nothing appropriate in the buffer near point."
                 ((string-match "^\\([A-Z]+\\) statement\\b" item)
                    (match-string 1 item))
                 (t nil)))
-             nil; "^ - [^:]+:[ ]+" don't think this prefix is useful here.
+             nil; "^ -+ [^:]+:[ ]+" don't think this prefix is useful here.
              nil)))
 
 (info-lookup-maybe-add-help
  :mode 'maxima-mode
  :ignore-case t
  :regexp "[a-zA-Z_%]+"
- :doc-spec '( ("(maxima)Function and Variable Index" nil 
-              "^ - [^:]+:[ ]+\\(\\[[^=]*=[ ]+\\)?" nil)))
+ :doc-spec '( ("(maxima)Function and Variable Index" nil
+              "^ -+ [^:]+:[ ]+\\(\\[[^=]*=[ ]+\\)?" nil)))
 
 (info-lookup-maybe-add-help
  :mode 'inferior-maxima-mode
@@ -887,6 +895,22 @@ Return nil if there is nothing appropriate in the buffer near point."
                        "awk")
                       ((string-equal item "gawk, versions of, information about, printing")
                        "gawk"))))))
+
+;; This misses some things which occur as node names but not in the
+;; index.  Unfortunately it also picks up the wrong one of multiple
+;; entries for the same term in some cases.  --fx
+(info-lookup-maybe-add-help
+ :mode 'cfengine-mode
+ :regexp "[[:alnum:]_]+\\(?:()\\)?"
+ :doc-spec '(("(cfengine-Reference)Variable Index"
+             (lambda (item)
+               ;; Index entries may be like `IsPlain()'
+               (if (string-match "\\([[:alnum:]_]+\\)()" item)
+                   (match-string 1 item)
+                 item))
+             ;; This gets functions in evaluated classes.  Other
+             ;; possible patterns don't seem to work too well.
+             "`" "(")))
 \f
 (provide 'info-look)