changeset 55174:084cf910857b

Add *info*<[0-9]+> to same-window-regexps instead of same-window-buffer-names. (info): New arg `buffer'. Use it. Doc fix. Read file name for non-numeric prefix argument, append the number to the buffer name for numeric prefix argument. (info-other-window): Bind same-window-regexps to nil. (Info-reference-name): Rename to Info-point-loc. (Info-find-node-2): Call forward-line for numeric Info-point-loc, and Info-find-index-name for stringy Info-point-loc. (Info-extract-menu-node-name): New arg `index-node'. Use regexp without middle `.', but with final `.' and optional line number for it. Set Info-point-loc for index nodes. (Info-index): Remove middle `.' from index entry regexp. Modify line number regexp. (Info-index-next): Decrement line number. (info-apropos): Remove middle `.' from index entry regexp. Add optional line number regexp at the end. Add matched value for line number to the result list and insert it to the buffer. (Info-fontify-node): Hide index line numbers. (Info-goto-node): Replace "\\s *\\'" by "\\s +\\'" to not trim empty matches. (Info-follow-reference): Use `str' instead of Info-following-node-name-re. (Info-toc): Use full file names. Set Info-current-node to "Top". (Info-fontify-node): Compare file names without directory name. (Info-try-follow-nearest-node): Don't set Info-reference-name. Set second arg of Info-extract-menu-node-name for index nodes. (info-xref-visited): Use magenta3 instead of magenta4. (Info-mode): Add info-apropos to docstring.
author Juri Linkov <juri@jurta.org>
date Tue, 27 Apr 2004 06:39:46 +0000
parents ff738c1cdcc9
children e7a5be902830
files lisp/info.el
diffstat 1 files changed, 79 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/info.el	Tue Apr 27 06:37:35 2004 +0000
+++ b/lisp/info.el	Tue Apr 27 06:39:46 2004 +0000
@@ -88,7 +88,7 @@
 (defface info-xref-visited
   '((t :inherit info-xref)
     (((class color) (background light)) :foreground "magenta4")
-    (((class color) (background dark)) :foreground "magenta4"))
+    (((class color) (background dark)) :foreground "magenta3")) ;"violet"?
   "Face for visited Info cross-references."
   :group 'info)
 
@@ -239,10 +239,11 @@
 (defvar Info-index-alternatives nil
   "List of possible matches for last `Info-index' command.")
 
-(defvar Info-reference-name nil
-  "Name of the selected cross-reference.
-Point is moved to the proper occurrence of this name within a node
-after selecting it.")
+(defvar Info-point-loc nil
+  "Point location within a selected node.
+If string, the point is moved to the proper occurrence of the
+name of the followed cross reference within a selected node.
+If number, the point is moved to the corresponding line.")
 
 (defvar Info-standalone nil
   "Non-nil if Emacs was started solely as an Info browser.")
@@ -449,28 +450,38 @@
   "Like `info' but show the Info buffer in another window."
   (interactive (if current-prefix-arg
 		   (list (read-file-name "Info file name: " nil nil t))))
-  (let (same-window-buffer-names)
+  (let (same-window-buffer-names same-window-regexps)
     (info file)))
 
-;;;###autoload (add-hook 'same-window-buffer-names "*info*")
+;;;###autoload (add-hook 'same-window-regexps "\\*info\\*\\(\\|<[0-9]+>\\)")
 
 ;;;###autoload
-(defun info (&optional file)
+(defun info (&optional file buffer)
   "Enter Info, the documentation browser.
 Optional argument FILE specifies the file to examine;
 the default is the top-level directory of Info.
 Called from a program, FILE may specify an Info node of the form
 `(FILENAME)NODENAME'.
+Optional argument BUFFER specifies the Info buffer name;
+the default buffer name is *info*.  If BUFFER exists,
+just switch to BUFFER.  Otherwise, create a new buffer
+with the top-level Info directory.
 
-In interactive use, a prefix argument directs this command
-to read a file name from the minibuffer.
+In interactive use, a non-numeric prefix argument directs
+this command to read a file name from the minibuffer.
+A numeric prefix argument appends the number to the buffer name.
 
 The search path for Info files is in the variable `Info-directory-list'.
 The top-level Info directory is made by combining all the files named `dir'
 in all the directories in that path."
-  (interactive (if current-prefix-arg
-		   (list (read-file-name "Info file name: " nil nil t))))
-  (pop-to-buffer "*info*")
+  (interactive (list
+                (if (and current-prefix-arg (not (numberp current-prefix-arg)))
+                    (read-file-name "Info file name: " nil nil t))
+                (if (numberp current-prefix-arg)
+                    (format "*info*<%s>" current-prefix-arg))))
+  (pop-to-buffer (or buffer "*info*"))
+  (if (and buffer (not (eq major-mode 'Info-mode)))
+      (Info-mode))
   (if file
       ;; If argument already contains parentheses, don't add another set
       ;; since the argument will then be parsed improperly.  This also
@@ -866,9 +877,12 @@
                            (cons new-history
                                  (delete new-history Info-history-list))))
                    (goto-char anchorpos))
-		  (Info-reference-name
-		   (Info-find-index-name Info-reference-name)
-		   (setq Info-reference-name nil))))))
+                  ((numberp Info-point-loc)
+                   (forward-line (1- Info-point-loc))
+                   (setq Info-point-loc nil))
+		  ((stringp Info-point-loc)
+		   (Info-find-index-name Info-point-loc)
+		   (setq Info-point-loc nil))))))
     ;; If we did not finish finding the specified node,
     ;; go back to the previous one.
     (or Info-current-node no-going-back (null Info-history)
@@ -1313,9 +1327,9 @@
 		       ""
 		     (match-string 2 nodename))
 	  nodename (match-string 3 nodename))
-    (let ((trim (string-match "\\s *\\'" filename)))
+    (let ((trim (string-match "\\s +\\'" filename)))
       (if trim (setq filename (substring filename 0 trim))))
-    (let ((trim (string-match "\\s *\\'" nodename)))
+    (let ((trim (string-match "\\s +\\'" nodename)))
       (if trim (setq nodename (substring nodename 0 trim))))
     (if transient-mark-mode (deactivate-mark))
     (Info-find-node (if (equal filename "") nil filename)
@@ -1664,10 +1678,11 @@
         (insert "*Note Top::\n")
         (Info-insert-toc
          (nth 2 (assoc "Top" node-list)) ; get Top nodes
-         node-list 0 (file-name-nondirectory curr-file)))
+         node-list 0 curr-file))
       (if (not (bobp))
           (let ((Info-hide-note-references 'hide)
                 (Info-fontify-visited-nodes nil))
+            (setq Info-current-node "Top")
             (Info-fontify-node)))
       (goto-char (point-min))
       (if (setq p (search-forward (concat "*Note " curr-node ":") nil t))
@@ -1829,8 +1844,7 @@
           (if (and (save-excursion
                      (goto-char (+ (point) 5)) ; skip a possible *note
                      (re-search-backward "\\*note[ \n\t]+" nil t)
-                     (looking-at (concat "\\*note[ \n\t]+"
-                                         (Info-following-node-name-re "^.,\t"))))
+                     (looking-at str))
                    (<= (point) (match-end 0)))
               (goto-char (match-beginning 0))))
       ;; Go to the reference closest to point
@@ -1858,11 +1872,27 @@
 Because of ambiguities, this should be concatenated with something like
 `:' and `Info-following-node-name-re'.")
 
-(defun Info-extract-menu-node-name (&optional multi-line)
+(defun Info-extract-menu-node-name (&optional multi-line index-node)
   (skip-chars-forward " \t\n")
   (when (looking-at (concat Info-menu-entry-name-re ":\\(:\\|"
 			    (Info-following-node-name-re
-			     (if multi-line "^.,\t" "^.,\t\n")) "\\)"))
+                             (cond
+                              (index-node "^,\t\n")
+                              (multi-line "^.,\t")
+                              (t          "^.,\t\n")))
+                            "\\)"
+                            (if index-node
+                                "\\.\\(?:[ \t\n]+(line +\\([0-9]+\\))\\)?"
+                              "")))
+    (if index-node
+        (setq Info-point-loc
+              (if (match-beginning 5)
+                  (string-to-number (match-string 5))
+                (buffer-substring (match-beginning 0) (1- (match-beginning 1)))))
+;;; Comment out the next line to use names of cross-references:
+;;;       (setq Info-point-loc
+;;;             (buffer-substring (match-beginning 0) (1- (match-beginning 1))))
+      )
     (replace-regexp-in-string
      "[ \n]+" " "
      (or (match-string 2)
@@ -2327,7 +2357,7 @@
   (if (equal Info-current-file "dir")
       (error "The Info directory node has no index; use m to select a manual"))
   (let ((orignode Info-current-node)
-	(pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ \t]+\\([^.\n]*\\)\\.[ \t]*\\([0-9]*\\)"
+	(pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ \t]+\\([^\n]*\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?"
 			 (regexp-quote topic)))
 	node
 	(case-fold-search t))
@@ -2379,7 +2409,7 @@
 	  num (1- num)))
   (Info-goto-node (nth 1 (car Info-index-alternatives)))
   (if (> (nth 3 (car Info-index-alternatives)) 0)
-      (forward-line (nth 3 (car Info-index-alternatives)))
+      (forward-line (1- (nth 3 (car Info-index-alternatives))))
     (forward-line 3)			; don't search in headers
     (let ((name (car (car Info-index-alternatives))))
       (Info-find-index-name name)))
@@ -2418,7 +2448,7 @@
 Build a menu of the possible matches."
   (interactive "sIndex apropos: ")
   (unless (string= string "")
-    (let ((pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ \t]+\\([^.]+\\)."
+    (let ((pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ \t]+\\([^\n]+\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?"
 			   (regexp-quote string)))
 	  (ohist Info-history)
 	  (ohist-list Info-history-list)
@@ -2447,9 +2477,10 @@
 			(goto-char (point-min))
 			(while (re-search-forward pattern nil t)
 			  (add-to-list 'matches
-				       (list (match-string 1)
-					     (match-string 2)
-					     manual)))
+				       (list manual
+					     (match-string-no-properties 1)
+					     (match-string-no-properties 2)
+					     (match-string-no-properties 3))))
 			(and (setq node (Info-extract-pointer "next" t))
 			     (string-match "\\<Index\\>" node)))
 		    (Info-goto-node node))))
@@ -2465,8 +2496,10 @@
 	  (insert "\n\nFile: apropos, Node: Top, Up: (dir)\n")
 	  (insert "* Menu: \nNodes whose indices contain \"" string "\"\n\n")
 	  (dolist (entry matches)
-	    (insert "* " (car entry) " [" (nth 2 entry)
-		    "]: (" (nth 2 entry) ")" (nth 1 entry) ".\n")))
+	    (insert "* " (nth 1 entry) " [" (nth 0 entry)
+                    "]: (" (nth 0 entry) ")" (nth 2 entry) "."
+                    (if (nth 3 entry) (concat " (line " (nth 3 entry) ")") "")
+                    "\n")))
 	(Info-find-node "apropos" "top")
 	(setq Info-complete-cache nil)))))
 
@@ -2584,21 +2617,16 @@
       (browse-url (browse-url-url-at-point)))
      ((setq node (Info-get-token (point) "\\*note[ \n\t]+"
 				 "\\*note[ \n\t]+\\([^:]*\\):\\(:\\|[ \n\t]*(\\)?"))
-;;;       (or (match-string 2)
-;;;           (setq Info-reference-name
-;;;                 (replace-regexp-in-string
-;;;                  "[ \n\t]+" " " (match-string-no-properties 1))))
       (Info-follow-reference node fork))
      ;; menu item: node name
      ((setq node (Info-get-token (point) "\\* +" "\\* +\\([^:]*\\)::"))
       (Info-goto-node node fork))
-     ;; menu item: index entry
+     ;; menu item: node name or index entry
      ((Info-get-token (point) "\\* +" "\\* +\\(.*\\): ")
-      (if (save-match-data (string-match "\\<index\\>" Info-current-node))
-          (setq Info-reference-name (match-string-no-properties 1)))
       (beginning-of-line)
       (forward-char 2)
-      (setq node (Info-extract-menu-node-name))
+      (setq node (Info-extract-menu-node-name
+                  nil (string-match "\\<index\\>" Info-current-node)))
       (Info-goto-node node fork))
      ((setq node (Info-get-token (point) "Up: " "Up: \\([^,\n\t]*\\)"))
       (Info-goto-node node fork))
@@ -2848,6 +2876,7 @@
 \\[Info-toc]	Go to the buffer with a table of contents.
 \\[Info-index]	Look up a topic in this file's Index and move to that node.
 \\[Info-index-next]	(comma) Move to the next match from a previous \\<Info-mode-map>\\[Info-index] command.
+\\[info-apropos]	Look for a string in the indices of all manuals.
 \\[Info-top-node]	Go to the Top node of this file.
 \\[Info-final-node]	Go to the final node in this file.
 \\[Info-backward-node]	Go backward one node, considering all nodes as forming one sequence.
@@ -3352,7 +3381,8 @@
                                   (hl Info-history-list)
                                   res)
                              (if (string-match "(\\([^)]+\\))\\([^)]*\\)" node)
-                                 (setq file (match-string 1 node)
+                                 (setq file (file-name-nondirectory
+                                             (match-string 1 node))
                                        node (if (equal (match-string 2 node) "")
                                                 "Top"
                                               (match-string 2 node))))
@@ -3452,7 +3482,8 @@
                                  (hl Info-history-list)
                                  res)
                              (if (string-match "(\\([^)]+\\))\\([^)]*\\)" node)
-                                 (setq file (match-string 1 node)
+                                 (setq file (file-name-nondirectory
+                                             (match-string 1 node))
                                        node (if (equal (match-string 2 node) "")
                                                 "Top"
                                               (match-string 2 node))))
@@ -3500,6 +3531,13 @@
           (put-text-property (match-beginning 1) (match-end 1)
                              'font-lock-face 'info-menu-header)))
 
+      ;; Hide index line numbers
+      (goto-char (point-min))
+      (when (and not-fontified-p (string-match "\\<Index\\>" Info-current-node))
+        (while (re-search-forward "[ \t\n]*(line +[0-9]+)" nil t)
+          (put-text-property (match-beginning 0) (match-end 0)
+                             'invisible t)))
+
       ;; Fontify http and ftp references
       (goto-char (point-min))
       (when not-fontified-p