Merge from emacs-23
[bpt/emacs.git] / lisp / info-look.el
index 6caf454..065e1be 100644 (file)
@@ -2,7 +2,7 @@
 ;; An older version of this was known as libc.el.
 
 ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003,
-;;   2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;;   2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 
 ;; Author: Ralph Schleicher <rs@nunatak.allgaeu.org>
 ;;         (did not show signs of life (Nov 2001)  -stef)
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; 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 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, 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
@@ -21,9 +21,7 @@
 ;; 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, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
@@ -337,22 +335,23 @@ If optional argument QUERY is non-nil, query for the help mode."
              (cons (list Info-current-file Info-current-node (point))
                    Info-history))))
          found doc-spec node prefix suffix doc-found)
-    (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*"))))))
+    (unless (eq major-mode 'Info-mode)
+      (if (not info-lookup-other-window-flag)
+         (info)
+       (save-window-excursion (info))
+       (let* ((info-window (get-buffer-window "*info*" t))
+              (info-frame (and info-window (window-frame info-window))))
+         (if (and info-frame
+                  (not (eq info-frame (selected-frame)))
+                  (display-multi-frame-p)
+                  (memq info-frame (frames-on-display-list)))
+             ;; *info* is visible in another frame on same display.
+             ;; Raise that frame and select the window.
+             (progn
+               (select-window info-window)
+               (raise-frame info-frame))
+           ;; In any other case, switch to *info* in another window.
+           (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)
@@ -757,12 +756,15 @@ Return nil if there is nothing appropriate in the buffer near point."
              ;; 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
-             ;; names, m4_ to others which don't already an m4_.
+             ;; names (if needed), m4_ to others which don't already an m4_.
              ("(autoconf)M4 Macro Index"
               (lambda (item)
                 (let ((case-fold-search nil))
                   (cond ((or (string-equal item "dnl")
-                             (string-match "^m4_" item))
+                             (string-match "^m4_" item)
+                             ;; Autoconf 2.62 index includes some macros
+                             ;; (e.g., AS_HELP_STRING), so avoid prefixing.
+                             (string-match "^AS_" item))
                          item)
                         ((string-match "^[A-Z0-9_]+$" item)
                          (concat "AS_" item))
@@ -859,6 +861,12 @@ Return nil if there is nothing appropriate in the buffer near point."
              ;; sort of fallback match scheme existed.
              ("(elisp)Index"          nil "^ -+ .*: " "\\( \\|$\\)")))
 
+;; docstrings talk about elisp, so have apropos-mode follow emacs-lisp-mode
+(info-lookup-maybe-add-help
+ :mode 'apropos-mode
+ :regexp "[^][()`',\" \t\n]+" ;; same as emacs-lisp-mode above
+ :other-modes '(emacs-lisp-mode))
+
 (info-lookup-maybe-add-help
  :mode 'lisp-interaction-mode
  :regexp "[^][()`',\" \t\n]+"
@@ -881,10 +889,11 @@ Return nil if there is nothing appropriate in the buffer near point."
 
 (info-lookup-maybe-add-help
  :mode 'octave-mode
- :regexp "[_a-zA-Z0-9]+"
+ :regexp "[_a-zA-Z0-9]+\\|\\s.+\\|[-!=^|*/.\\,><~&+]\\{1,3\\}\\|[][();,\"']"
  :doc-spec '(("(octave)Function Index" nil
              "^ -+ [^:]+:[ ]+\\(\\[[^=]*=[ ]+\\)?" nil)
             ("(octave)Variable Index" nil "^ -+ [^:]+:[ ]+" nil)
+             ("(octave)Operator Index" nil nil nil)
             ;; Catch lines of the form "xyz statement"
             ("(octave)Concept Index"
              (lambda (item)
@@ -927,11 +936,18 @@ Return nil if there is nothing appropriate in the buffer near point."
  :doc-spec '(("(bash)Builtin Index"       nil "^`" "[ .']")
              ("(bash)Reserved Word Index" nil "^`" "[ .']")
              ("(bash)Variable Index"      nil "^`" "[ .']")
+
              ;; coreutils (version 4.5.10) doesn't have a separate program
              ;; index, so exclude extraneous stuff (most of it) by demanding
              ;; "[a-z]+" in the trans-func.
+             ;; coreutils version 8.1 has node "Concept Index" and past
+             ;; versions have node "Index", look for both, whichever is
+             ;; absent is quietly ignored
              ("(coreutils)Index"
               (lambda (item) (if (string-match "\\`[a-z]+\\'" item) item)))
+             ("(coreutils)Concept Index"
+              (lambda (item) (if (string-match "\\`[a-z]+\\'" item) item)))
+
              ;; diff (version 2.8.1) has only a few programs, index entries
              ;; are things like "foo invocation".
              ("(diff)Index"
@@ -970,7 +986,7 @@ Return nil if there is nothing appropriate in the buffer near point."
              "`" "(")))
 
 (info-lookup-maybe-add-help
- :mode 'custom-mode
+ :mode 'Custom-mode
  :ignore-case t
  :regexp "[^][()`',:\" \t\n]+"
  :parse-rule 'info-lookup-guess-custom-symbol
@@ -983,5 +999,5 @@ Return nil if there is nothing appropriate in the buffer near point."
 \f
 (provide 'info-look)
 
-;;; arch-tag: 0f1e3ea3-32a2-4461-bbab-3cff93539a74
+;; arch-tag: 0f1e3ea3-32a2-4461-bbab-3cff93539a74
 ;;; info-look.el ends here