]> code.delx.au - gnu-emacs/blobdiff - lisp/info.el
*** empty log message ***
[gnu-emacs] / lisp / info.el
index 1c6242375deab3d5a3f33bc8e4eb95f20fea6a83..86642b7fd361f73004d26585e1dd35104304e29c 100644 (file)
@@ -61,9 +61,9 @@ The Lisp code is executed when the node is selected.")
   :group 'info)
 
 (defface info-node
-  '((((class color) (background light)) (:foreground "brown" :bold t :italic t))
-    (((class color) (background dark)) (:foreground "white" :bold t :italic t))
-    (t (:bold t :italic t)))
+  '((((class color) (background light)) (:foreground "brown" :weight bold :slant italic))
+    (((class color) (background dark)) (:foreground "white" :weight bold :slant italic))
+    (t (:weight bold :slant italic)))
   "Face for Info node names."
   :group 'info)
 
@@ -74,9 +74,9 @@ The Lisp code is executed when the node is selected.")
   :group 'info)
 
 (defface info-xref
-  '((((class color) (background light)) (:foreground "magenta4" :bold t))
-    (((class color) (background dark)) (:foreground "cyan" :bold t))
-    (t (:bold t)))
+  '((((class color) (background light)) (:foreground "magenta4" :weight bold))
+    (((class color) (background dark)) (:foreground "cyan" :weight bold))
+    (t (:weight bold)))
   "Face for Info cross-references."
   :group 'info)
 
@@ -609,7 +609,7 @@ a case-insensitive match is tried."
               (erase-buffer)
               (if (eq filename t)
                   (Info-insert-dir)
-                (info-insert-file-contents filename t)
+                (info-insert-file-contents filename nil)
                 (setq default-directory (file-name-directory filename)))
               (set-buffer-modified-p nil)
               ;; See whether file has a tag table.  Record the location if yes.
@@ -999,7 +999,8 @@ Bind this in case the user sets it to nil."
        (if Info-fontify (Info-fontify-node))
        (if Info-use-header-line
            (Info-setup-header-line)
-         (setq Info-header-line nil))
+         (setq Info-header-line nil)
+         (setq header-line-format nil)) ; so the header line isn't displayed
        (run-hooks 'Info-selection-hook)))))
 
 (defun Info-set-mode-line ()
@@ -1393,12 +1394,7 @@ FOOTNOTENAME may be an abbreviation of the reference name."
              (buffer-substring-no-properties beg (1- (point)))
            (skip-chars-forward " \t\n")
            (Info-following-node-name (if multi-line "^.,\t" "^.,\t\n"))))
-    (while (setq i (string-match "\n" str i))
-      (aset str i ?\ ))
-    ;; Collapse multiple spaces.
-    (while (string-match "  +" str)
-      (setq str (replace-match " " t t str)))
-    str))
+    (replace-regexp-in-string "[ \n]+" " " str)))
 
 ;; No one calls this.
 ;;(defun Info-menu-item-sequence (list)
@@ -1411,6 +1407,13 @@ FOOTNOTENAME may be an abbreviation of the reference name."
 (defvar Info-complete-cache nil)
 
 (defun Info-complete-menu-item (string predicate action)
+  ;; This uses two dynamically bound variables:
+  ;; - `Info-complete-menu-buffer' which contains the buffer in which
+  ;; is the menu of items we're trying to complete.
+  ;; - `Info-complete-next-re' which, if non-nil, indicates that we should
+  ;; also look for menu items in subsequent nodes as long as those
+  ;; nodes' names match `Info-complete-next-re'.  This feature is currently
+  ;; only used for completion in Info-index.
   (save-excursion
     (set-buffer Info-complete-menu-buffer)
     (let ((completion-ignore-case t)
@@ -1831,7 +1834,9 @@ parent node."
   (or (re-search-forward "\n\\* \\(.*\\<Index\\>\\)" nil t)
       (error "No index"))
   (goto-char (match-beginning 1))
-  (Info-goto-node (Info-extract-menu-node-name)))
+  ;; Protect Info-history so that the current node (Top) is not added to it.
+  (let ((Info-history nil))
+    (Info-goto-node (Info-extract-menu-node-name))))
 
 (defun Info-index (topic)
   "Look up a string TOPIC in the index for this file.
@@ -1857,16 +1862,14 @@ Give a blank topic name to go to the Index node itself."
                         (regexp-quote topic)))
        node
        (case-fold-search t))
-    ;; Here, and subsequently in this function,
-    ;; we bind Info-history to nil for internal node-switches
-    ;; so that we don't put junk in the history.
-    ;; In the first Info-goto-node call, above, we do update the history
-    ;; because that is what the user's previous node choice into it.
-    (let ((Info-history nil))
-      (Info-goto-index))
+    (Info-goto-index)
     (or (equal topic "")
        (let ((matches nil)
              (exact nil)
+             ;; We bind Info-history to nil for internal node-switches so
+             ;; that we don't put junk in the history.  In the first
+             ;; Info-goto-index call, above, we do update the history
+             ;; because that is what the user's previous node choice into it.
              (Info-history nil)
              found)
          (while
@@ -2148,17 +2151,17 @@ If no reference to follow, moves to the next node, or up if none."
 
 (defvar info-tool-bar-map
   (if (display-graphic-p)
-      (let ((tool-bar-map (make-sparse-keymap)))
-       (tool-bar-add-item-from-menu 'Info-exit "close" Info-mode-map)
-       (tool-bar-add-item-from-menu 'Info-prev "left_arrow" Info-mode-map)
-       (tool-bar-add-item-from-menu 'Info-next "right_arrow" Info-mode-map)
-       (tool-bar-add-item-from-menu 'Info-up "up_arrow" Info-mode-map)
-       (tool-bar-add-item-from-menu 'Info-last "undo" Info-mode-map)
-       (tool-bar-add-item-from-menu 'Info-top-node "home" Info-mode-map)
-       (tool-bar-add-item-from-menu 'Info-index "index" Info-mode-map)
-       (tool-bar-add-item-from-menu 'Info-goto-node "jump_to" Info-mode-map)
-       (tool-bar-add-item-from-menu 'Info-search "search" Info-mode-map)
-       tool-bar-map)))
+      (let ((map (make-sparse-keymap)))
+       (tool-bar-local-item-from-menu 'Info-exit "close" map Info-mode-map)
+       (tool-bar-local-item-from-menu 'Info-prev "left_arrow" map Info-mode-map)
+       (tool-bar-local-item-from-menu 'Info-next "right_arrow" map Info-mode-map)
+       (tool-bar-local-item-from-menu 'Info-up "up_arrow" map Info-mode-map)
+       (tool-bar-local-item-from-menu 'Info-last "undo" map Info-mode-map)
+       (tool-bar-local-item-from-menu 'Info-top-node "home" map Info-mode-map)
+       (tool-bar-local-item-from-menu 'Info-index "index" map Info-mode-map)
+       (tool-bar-local-item-from-menu 'Info-goto-node "jump_to" map Info-mode-map)
+       (tool-bar-local-item-from-menu 'Info-search "search" map Info-mode-map)
+       map)))
 
 (defvar Info-menu-last-node nil)
 ;; Last node the menu was created for.
@@ -2269,7 +2272,7 @@ Selecting other nodes:
 \\[Info-prev]  Move to the \"previous\" node of this node.
 \\[Info-up]    Move \"up\" from this node.
 \\[Info-menu]  Pick menu item specified by name (or abbreviation).
-       Picking a menu item causes another node to be selected.
+         Picking a menu item causes another node to be selected.
 \\[Info-directory]     Go to the Info directory node.
 \\[Info-follow-reference]      Follow a cross reference.  Reads name of reference.
 \\[Info-last]  Move to the last node you were at.
@@ -2282,12 +2285,13 @@ Selecting other nodes:
 
 Moving within a node:
 \\[Info-scroll-up]     Normally, scroll forward a full screen.
-Once you scroll far enough in a node that its menu appears on the screen
-but after point, the next scroll moves into its first subnode.
-When after all menu items (or if their is no menu), move up to
-the parent node.
+         Once you scroll far enough in a node that its menu appears on the
+         screen but after point, the next scroll moves into its first
+         subnode.  When after all menu items (or if there is no menu),
+         move up to the parent node.
 \\[Info-scroll-down]   Normally, scroll backward.  If the beginning of the buffer is
-already visible, try to go to the previous menu entry, or up if there is none.
+         already visible, try to go to the previous menu entry, or up
+         if there is none.
 \\[beginning-of-buffer]        Go to beginning of node.
 
 Advanced commands:
@@ -2296,10 +2300,10 @@ Advanced commands:
 1      Pick first item in node's menu.
 2, 3, 4, 5   Pick second ... fifth item in node's menu.
 \\[Info-goto-node]     Move to node specified by name.
-       You may include a filename as well, as (FILENAME)NODENAME.
+         You may include a filename as well, as (FILENAME)NODENAME.
 \\[universal-argument] \\[info]        Move to new Info file with completion.
 \\[Info-search]        Search through this Info file for specified regexp,
-       and select the node in which the next occurrence is found.
+         and select the node in which the next occurrence is found.
 \\[Info-next-reference]        Move cursor to next cross-reference or menu item.
 \\[Info-prev-reference]        Move cursor to previous cross-reference or menu item."
   (kill-all-local-variables)
@@ -2575,8 +2579,15 @@ the variable `Info-file-list-for-emacs'."
   ;; Only fontify the node if it hasn't already been done.  [We pass in
   ;; LIMIT arg to `next-property-change' because it seems to search past
   ;; (point-max).]
-  (unless (< (next-property-change (point-min) nil (point-max))
-            (point-max))
+  (unless (and (< (next-property-change (point-min) nil (point-max))
+                 (point-max))
+              ;; But do put the text properties if the local-map property
+              ;; is inconsistent with Info-use-header-line's value.
+              (eq
+               (= (next-single-property-change
+                   (point-min) 'local-map nil (point-max))
+                  (point-max))
+               (null Info-use-header-line)))
     (save-excursion
       (let ((buffer-read-only nil)
            (case-fold-search t))
@@ -2592,20 +2603,29 @@ the variable `Info-file-list-for-emacs'."
              (if (string-equal tag "Node")
                  (put-text-property nbeg nend 'face 'info-header-node)
                (put-text-property nbeg nend 'face 'info-header-xref)
-               (put-text-property nbeg nend 'mouse-face 'highlight)
+               (put-text-property tbeg nend 'mouse-face 'highlight)
                (put-text-property tbeg nend
                                   'help-echo
                                   (concat "Go to node "
                                           (buffer-substring nbeg nend)))
-               (let ((fun (cdr (assoc tag '(("Prev" . Info-prev)
-                                            ("Next" . Info-next)
-                                            ("Up" . Info-up))))))
-                 (when fun
-                   (let ((keymap (make-sparse-keymap)))
-                     (define-key keymap [header-line down-mouse-1] fun)
-                     (define-key keymap [header-line down-mouse-2] fun)
-                     (put-text-property tbeg nend 'local-map keymap))))
-               ))))
+               ;; Don't bind mouse events on the header line if we
+               ;; aren't going to display the header line.
+               (when Info-use-header-line
+                 (let ((fun (cdr (assoc tag '(("Prev" . Info-prev)
+                                              ("Next" . Info-next)
+                                              ("Up" . Info-up))))))
+                   (when fun
+                     (let ((keymap (make-sparse-keymap)))
+                       (define-key keymap [header-line mouse-1] fun)
+                       (define-key keymap [header-line mouse-2] fun)
+                       (put-text-property tbeg nend 'local-map keymap)))))
+               (if (not Info-use-header-line)
+                   ;; In case they switched Info-use-header-line off
+                   ;; in the middle of an Info session, some text
+                   ;; properties may have been left lying around from
+                   ;; past visits of this node.  Remove them.
+                   (remove-text-properties tbeg nend '(local-map nil)))
+                 ))))
        (goto-char (point-min))
        (while (re-search-forward "\n\\([^ \t\n].+\\)\n\\(\\*+\\|=+\\|-+\\|\\.+\\)$"
                                  nil t)
@@ -2621,10 +2641,8 @@ the variable `Info-file-list-for-emacs'."
          ;; frame types at once.  We want this text to be invisible
          ;; on frames that can display the font above.
          (when (memq (framep (selected-frame)) '(x pc w32 mac))
-           (add-text-properties (match-end 1) (match-end 2)
-                                '(invisible t intangible t))
-           (add-text-properties (1- (match-end 1)) (match-end 2)
-                                '(intangible t))))
+           (add-text-properties (match-beginning 2) (1+ (match-end 2))
+                                '(invisible t intangible t))))
        (goto-char (point-min))
        (while (re-search-forward "\\*Note[ \n\t]+\\([^:]*\\):" nil t)
          (if (= (char-after (1- (match-beginning 0))) ?\") ; hack