unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* info.el
@ 2004-04-05  9:44 Juri Linkov
  2004-04-06  0:20 ` info.el Karl Berry
  2004-04-06 12:51 ` info.el Jan Nieuwenhuizen
  0 siblings, 2 replies; 21+ messages in thread
From: Juri Linkov @ 2004-04-05  9:44 UTC (permalink / raw)
  Cc: karl

I still can't decide what is the best way to submit changes for
info.el.  I know that it's better to submit one feature in a single
patch.  But I'm not sure I should submit 33 separate patches.
So I grouped already discussed and supposedly approved changes
to a single patch.  I will post other "controversial" or not yet
discussed changes later in separate patches.

2004-04-05  Juri Linkov  <juri@jurta.org>

	* info.el (Info-history): Doc fix.
	(Info-history-list): New var.
	(info-xref): Change magenta4 to blue, remove bold for dark and
	light backgrounds, change bold to underline for non-color classes.
	(info-xref-visited): New face.
	(Info-fontify-visited-nodes): New custom.
	(Info-hide-note-references): Add new value `hide'.  Doc fix.
	(Info-reference-name): New var.
	(Info-selection-hook): New custom.
	(Info-edit-mode-hook): New var.
	(Info-find-file): New fun.
	(Info-find-node): Move part of code to Info-find-file.
	(Info-find-node-2): Add anchors to Info-history-list.  Move point
	to the place with the reference name if name is defined.
	(Info-insert-dir): Use Info-following-node-name.
	(Info-select-node): Add current node to Info-history-list.
	(Info-goto-node): Switch to *info* from *info-history* *info-toc*.
	(Info-search-whitespace-regexp): New custom.
	(Info-search-case-fold): New var.
	(Info-search): Add "case-sensitively" to the prompt.  Use
	Info-search-whitespace-regexp.  Set Info-search-case-fold.
	(Info-search-case-sensitively, Info-search-next): New fun.
	(Info-up): Move point to the menu item of the current node.
	(Info-history): New fun.  Add *info-history* to same-window-buffer-names.
	(Info-toc): New fun.  Add *info-toc* to same-window-buffer-names.
	(Info-insert-toc): New fun.
	(Info-build-toc): New fun.
	(Info-follow-reference): Add new arg `fork'.  Doc fix.
	Replace [ \n\t]* by [ \n\t]+ in the *Note regexp.  For references
	with the same name prefer the reference closest to point.
	(Info-next-reference): Replace * by + in the *Note regexp.
	Add regexp for http:// and ftp://.  Skip the *Note prefix.
	(Info-prev-reference): Replace * by + in the *Note regexp.
	Add regexp for http:// and ftp://.  Skip the *Note prefix.
	(Info-follow-nearest-node): Add new arg `fork'.
	(Info-try-follow-nearest-node): Add new arg `fork'.
	Call browse-url for http:// and ftp:// references.
	Set Info-reference-name for index entries.
	(Info-mode-menu): Add menu items for Info-search-case-sensitively,
	Info-search-next, Info-history, Info-toc, clone-buffer.
	(Info-menu-update): Replace * by + in the *Note regexp.
	(Info-mode): Add documentation for Info-history, Info-toc,
	Info-search-case-sensitively, Info-search-next, clone-buffer.
	(Info-fontify-menu-headers): Remove fun.  Move code to
	Info-fontify-node.
	(Info-fontify-node): Add docstring.  Add local vars
	fontify-visited-p and not-fontified-p.  If not-fontified-p is t
	then fontify header line, titles, menu headers, http and ftp
	references, refill paragraphs.  If not-fontified-p is t or
	fontify-visited-p is t then fontify cross references, menu items.
	Fontify menu headers.  Fontify http and ftp references.  Change
	regexp for cross references to require whitespace after *Note, add
	matching groups for file and node names.  Remove hack for quote.
	Use display property for Info-hide-note-references=t.  Use fifth
	or fourth match for help-echo.  Display visited nodes in a
	different face.  Unhide file names of external references.  Unhide
	newlines.  Display visited menu items in a different face.

Index: emacs/lisp/info.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/info.el,v
retrieving revision 1.378
diff -c -r1.378 info.el
*** emacs/lisp/info.el	22 Mar 2004 17:12:16 -0000	1.378
--- emacs/lisp/info.el	5 Apr 2004 09:38:01 -0000
***************
*** 44,52 ****
  
  
  (defvar Info-history nil
!   "List of info nodes user has visited.
  Each element of list is a list (FILENAME NODENAME BUFFERPOS).")
  
  (defcustom Info-enable-edit nil
    "*Non-nil means the \\<Info-mode-map>\\[Info-edit] command in Info can edit the current node.
  This is convenient if you want to write info files by hand.
--- 44,56 ----
  
  
  (defvar Info-history nil
!   "Stack of info nodes user has visited.
  Each element of list is a list (FILENAME NODENAME BUFFERPOS).")
  
+ (defvar Info-history-list nil
+   "List of all info nodes user has visited.
+ Each element of list is a list (FILENAME NODENAME).")
+ 
  (defcustom Info-enable-edit nil
    "*Non-nil means the \\<Info-mode-map>\\[Info-edit] command in Info can edit the current node.
  This is convenient if you want to write info files by hand.
***************
*** 75,86 ****
    :group 'info)
  
  (defface info-xref
!   '((((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)
  
  (defcustom Info-fontify-maximum-menu-size 100000
    "*Maximum size of menu to fontify if `font-lock-mode' is non-nil."
    :type 'integer
--- 79,103 ----
    :group 'info)
  
  (defface info-xref
!   '((((class color) (background light)) (:foreground "blue"))
!     (((class color) (background dark)) (:foreground "cyan"))
!     (t (:underline t)))
    "Face for Info cross-references."
    :group 'info)
  
+ (defface info-xref-visited
+   '((((class color) (background light)) (:foreground "magenta4"))
+     (((class color) (background dark)) (:foreground "magenta4"))
+     (t (:underline t)))
+   "Face for visited Info cross-references."
+   :group 'info)
+ 
+ (defcustom Info-fontify-visited-nodes t
+   "*Non-nil means to fontify visited nodes in a different face."
+   :version "21.4"
+   :type 'boolean
+   :group 'info)
+ 
  (defcustom Info-fontify-maximum-menu-size 100000
    "*Maximum size of menu to fontify if `font-lock-mode' is non-nil."
    :type 'integer
***************
*** 154,165 ****
  
  (defcustom Info-hide-note-references t
    "*If non-nil, hide the tag and section reference in *note and * menu items.
! Also replaces the \"*note\" text with \"see\".
! If value is non-nil but not t, the reference section is still shown."
    :version "21.4"
!   :type '(choice (const :tag "No reformatting" nil)
  		 (const :tag "Replace tag and hide reference" t)
! 		 (other :tag "Replace only tag" tag))
    :group 'info)
  
  (defcustom Info-refill-paragraphs nil
--- 171,183 ----
  
  (defcustom Info-hide-note-references t
    "*If non-nil, hide the tag and section reference in *note and * menu items.
! If value is non-nil but not `hide', also replaces the \"*note\" with \"see\".
! If value is non-nil but not t or `hide', the reference section is still shown."
    :version "21.4"
!   :type '(choice (const :tag "No hiding" nil)
  		 (const :tag "Replace tag and hide reference" t)
! 		 (const :tag "Hide tag and reference" hide)
! 		 (other :tag "Only replace tag" tag))
    :group 'info)
  
  (defcustom Info-refill-paragraphs nil
***************
*** 170,183 ****
    :type 'boolean
    :group 'info)
  
  (defcustom Info-mode-hook
    ;; Try to obey obsolete Info-fontify settings.
    (unless (and (boundp 'Info-fontify) (null Info-fontify))
      '(turn-on-font-lock))
!   "Hooks run when `info-mode' is called."
    :type 'hook
    :group 'info)
  
  (defvar Info-current-file nil
    "Info file that Info is now looking at, or nil.
  This is the name that was specified in Info, not the actual file name.
--- 188,218 ----
    :type 'boolean
    :group 'info)
  
+ (defcustom Info-search-whitespace-regexp "\\\\(?:\\\\s-+\\\\)"
+   "*If non-nil, regular expression to match a sequence of whitespace chars.
+ This applies to Info search for regular expressions.
+ You might want to use something like \"[ \\t\\r\\n]+\" instead.
+ In the Customization buffer, that is `[' followed by a space,
+ a tab, a carriage return (control-M), a newline, and `]+'."
+   :type 'regexp
+   :group 'info)
+ 
  (defcustom Info-mode-hook
    ;; Try to obey obsolete Info-fontify settings.
    (unless (and (boundp 'Info-fontify) (null Info-fontify))
      '(turn-on-font-lock))
!   "Hooks run when `Info-mode' is called."
!   :type 'hook
!   :group 'info)
! 
! (defcustom Info-selection-hook nil
!   "Hooks run when `Info-select-node' is called."
    :type 'hook
    :group 'info)
  
+ (defvar Info-edit-mode-hook nil
+   "Hooks run when `Info-edit-mode' is called.")
+ 
  (defvar Info-current-file nil
    "Info file that Info is now looking at, or nil.
  This is the name that was specified in Info, not the actual file name.
***************
*** 204,209 ****
--- 239,249 ----
  (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-standalone nil
    "Non-nil if Emacs was started solely as an Info browser.")
  \f
***************
*** 488,498 ****
  	 (forward-line 1)		; does the line after delimiter match REGEXP?
  	 (re-search-backward regexp beg t))))
  
! (defun Info-find-node (filename nodename &optional no-going-back)
!   "Go to an info node specified as separate FILENAME and NODENAME.
! NO-GOING-BACK is non-nil if recovering from an error in this function;
! it says do not attempt further (recursive) error recovery."
!   (info-initialize)
    ;; Convert filename to lower case if not found as specified.
    ;; Expand it.
    (if (stringp filename)
--- 528,537 ----
  	 (forward-line 1)		; does the line after delimiter match REGEXP?
  	 (re-search-backward regexp beg t))))
  
! (defun Info-find-file (filename &optional noerror)
!   "Return expanded FILENAME, or t, if FILENAME is \"dir\".
! Optional second argument NOERROR, if t, means if file is not found
! just return nil (no error)."
    ;; Convert filename to lower case if not found as specified.
    ;; Expand it.
    (if (stringp filename)
***************
*** 541,547 ****
                (setq dirs (cdr dirs)))))
          (if found
              (setq filename found)
!           (error "Info file %s does not exist" filename))))
    ;; Record the node we are leaving.
    (if (and Info-current-file (not no-going-back))
        (setq Info-history
--- 580,596 ----
                (setq dirs (cdr dirs)))))
          (if found
              (setq filename found)
!           (if noerror
!               (setq filename nil)
!             (error "Info file %s does not exist" filename)))
!         filename)))
! 
! (defun Info-find-node (filename nodename &optional no-going-back)
!   "Go to an info node specified as separate FILENAME and NODENAME.
! NO-GOING-BACK is non-nil if recovering from an error in this function;
! it says do not attempt further (recursive) error recovery."
!   (info-initialize)
!   (setq filename (Info-find-file filename))
    ;; Record the node we are leaving.
    (if (and Info-current-file (not no-going-back))
        (setq Info-history
***************
*** 788,794 ****
  		       nodename)))
  
  	    (Info-select-node)
! 	    (goto-char (or anchorpos (point-min))))))
      ;; 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)
--- 837,854 ----
  		       nodename)))
  
  	    (Info-select-node)
! 	    (goto-char (point-min))
! 	    (cond (anchorpos
!                    (let ((new-history (list Info-current-file
!                                             (substring-no-properties nodename))))
!                      ;; Add anchors to the history too
!                      (setq Info-history-list
!                            (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))))))
      ;; 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)
***************
*** 912,920 ****
  		    nodename end)
  		(re-search-backward "^\^_")
  		(search-forward "Node: ")
! 		(setq nodename
! 		      (and (looking-at (Info-following-node-name-re))
! 			   (match-string 1)))
  		(search-forward "\n\^_" nil 'move)
  		(beginning-of-line)
  		(setq end (point))
--- 972,978 ----
  		    nodename end)
  		(re-search-backward "^\^_")
  		(search-forward "Node: ")
! 		(setq nodename (Info-following-node-name))
  		(search-forward "\n\^_" nil 'move)
  		(beginning-of-line)
  		(setq end (point))
***************
*** 1174,1179 ****
--- 1232,1241 ----
  					    (read (current-buffer))))))
  			    (point-max)))
  	(if Info-enable-active-nodes (eval active-expression))
+ 	;; Add a new unique history item to full history list
+ 	(let ((new-history (list Info-current-file Info-current-node)))
+ 	  (setq Info-history-list
+ 		(cons new-history (delete new-history Info-history-list))))
  	(Info-fontify-node)
  	(Info-display-images-node)
  	(run-hooks 'Info-selection-hook)))))
***************
*** 1207,1212 ****
--- 1269,1276 ----
    (if fork
        (set-buffer
         (clone-buffer (concat "*info-" (if (stringp fork) fork nodename) "*") t)))
+   (if (member (buffer-name) '("*info-history*" "*info-toc*"))
+       (switch-to-buffer "*info*"))
    (let (filename)
      (string-match "\\s *\\((\\s *\\([^\t)]*\\)\\s *)\\s *\\|\\)\\(.*\\)"
  		  nodename)
***************
*** 1315,1327 ****
  (defvar Info-search-history nil
    "The history list for `Info-search'.")
  
  (defun Info-search (regexp)
    "Search for REGEXP, starting from point, and select node it's found in."
    (interactive (list (read-string
  		      (if Info-search-history
! 			  (format "Regexp search (default `%s'): "
  				  (car Info-search-history))
! 			"Regexp search: ")
  		      nil 'Info-search-history)))
    (when transient-mark-mode
      (deactivate-mark))
--- 1379,1396 ----
  (defvar Info-search-history nil
    "The history list for `Info-search'.")
  
+ (defvar Info-search-case-fold nil
+   "The value of `case-fold-search' from previous `Info-search' command.")
+ 
  (defun Info-search (regexp)
    "Search for REGEXP, starting from point, and select node it's found in."
    (interactive (list (read-string
  		      (if Info-search-history
! 			  (format "Regexp search%s (default `%s'): "
!                                   (if case-fold-search "" " case-sensitively")
  				  (car Info-search-history))
! 			(format "Regexp search%s: "
!                                 (if case-fold-search "" " case-sensitively")))
  		      nil 'Info-search-history)))
    (when transient-mark-mode
      (deactivate-mark))
***************
*** 1334,1339 ****
--- 1403,1412 ----
  	  (opoint (point))
  	  (ostart (window-start))
  	  (osubfile Info-current-subfile))
+       (when Info-search-whitespace-regexp
+         (setq regexp (replace-regexp-in-string
+                       "[ \t\n]+" Info-search-whitespace-regexp regexp)))
+       (setq Info-search-case-fold case-fold-search)
        (save-excursion
  	(save-restriction
  	  (widen)
***************
*** 1409,1414 ****
--- 1482,1501 ----
  	       (equal ofile Info-current-file))
  	  (setq Info-history (cons (list ofile onode opoint)
  				   Info-history))))))
+ 
+ (defun Info-search-case-sensitively ()
+   "Search for a regexp case-sensitively."
+   (interactive)
+   (let ((case-fold-search nil))
+     (call-interactively 'Info-search)))
+ 
+ (defun Info-search-next ()
+   "Search for next regexp from a previous `Info-search' command."
+   (interactive)
+   (let ((case-fold-search Info-search-case-fold))
+     (if Info-search-history
+         (Info-search (car Info-search-history))
+       (call-interactively 'Info-search))))
  \f
  (defun Info-extract-pointer (name &optional errorname)
    "Extract the value of the node-pointer named NAME.
***************
*** 1460,1471 ****
    "Go to the superior node of this node.
  If SAME-FILE is non-nil, do not move to a different Info file."
    (interactive)
!   (let ((node (Info-extract-pointer "up")))
      (and (or same-file (not (stringp Info-current-file)))
  	 (string-match "^(" node)
  	 (error "Up node is in another Info file"))
!     (Info-goto-node node))
!   (Info-restore-point Info-history))
  
  (defun Info-last ()
    "Go back to the last node visited."
--- 1547,1571 ----
    "Go to the superior node of this node.
  If SAME-FILE is non-nil, do not move to a different Info file."
    (interactive)
!   (let ((old-node Info-current-node)
!         (old-file Info-current-file)
!         (node (Info-extract-pointer "up")) p)
      (and (or same-file (not (stringp Info-current-file)))
  	 (string-match "^(" node)
  	 (error "Up node is in another Info file"))
!     (Info-goto-node node)
!     (setq p (point))
!     (goto-char (point-min))
!     (if (and (search-forward "\n* Menu:" nil t)
!              (re-search-forward
!               (if (string-equal old-node "Top")
!                   (concat "\n\\*[^:]+: +(" (file-name-nondirectory old-file) ")")
!                 (concat "\n\\* +\\(" (regexp-quote old-node)
!                         ":\\|[^:]+: +" (regexp-quote old-node) "\\)"))
!               nil t))
!         (beginning-of-line)
!       (goto-char p)
!       (Info-restore-point Info-history))))
  
  (defun Info-last ()
    "Go back to the last node visited."
***************
*** 1487,1495 ****
    (interactive)
    (Info-find-node "dir" "top"))
  \f
! (defun Info-follow-reference (footnotename)
    "Follow cross reference named FOOTNOTENAME to the node it refers to.
! FOOTNOTENAME may be an abbreviation of the reference name."
    (interactive
     (let ((completion-ignore-case t)
  	 (case-fold-search t)
--- 1587,1746 ----
    (interactive)
    (Info-find-node "dir" "top"))
  \f
! ;;;###autoload (add-hook 'same-window-buffer-names "*info-history*")
! 
! (defun Info-history ()
!   "Create the buffer *info-history* with a menu of visited nodes."
!   (interactive)
!   (let ((curr-file Info-current-file)
!         (curr-node Info-current-node)
!         p)
!     (pop-to-buffer
!      (with-current-buffer (get-buffer-create "*info-history*")
!        (let ((inhibit-read-only t))
!          (erase-buffer)
!          (goto-char (point-min))
!          (insert "Node: History\n\n")
!          (insert "Recently Visited Nodes\n**********************\n\n")
!          (insert "* Menu:\n\n")
!          (let ((hl Info-history-list))
!            (while hl
!              (let ((file (nth 0 (car hl)))
!                    (node (nth 1 (car hl))))
!                (if (and (string-equal file curr-file)
!                         (string-equal node curr-node))
!                    (setq p (point)))
!                (insert "* " node ": (" (file-name-nondirectory file)
!                        ")" node ".\n"))
!              (setq hl (cdr hl))))
!          (or (eq major-mode 'Info-mode) (Info-mode))
!          (setq Info-current-file "info-history")
!          (setq Info-current-node "Info History")
!          (Info-set-mode-line)
!          (if (not (bobp)) (Info-fontify-node))
!          (current-buffer))))
!     (goto-char (or p (point-min)))))
! 
! ;;;###autoload (add-hook 'same-window-buffer-names "*info-toc*")
! 
! (defun Info-toc ()
!   "Create the buffer *info-toc* with Info file's table of contents."
!   (interactive)
!   (let ((curr-file Info-current-file)
!         (curr-node Info-current-node)
!         p)
!     (pop-to-buffer
!      (with-current-buffer (get-buffer-create "*info-toc*")
!        (if (not (equal Info-current-file curr-file))
!            (let ((inhibit-read-only t)
!                  (node-list (Info-build-toc curr-file)))
!              (erase-buffer)
!              (goto-char (point-min))
!              (insert "Node: Contents\n\n")
!              (insert "Table of Contents\n*****************\n\n")
!              (insert "*Note Top::\n")
!              (Info-insert-toc
!               (nth 2 (assoc "Top" node-list)) ; get Top nodes
!               node-list 0)
!              (or (eq major-mode 'Info-mode) (Info-mode))
!              (setq Info-current-file curr-file)
!              (setq Info-current-node "Contents")
!              (Info-set-mode-line)))
!        (if (not (bobp))
!            (let ((Info-hide-note-references 'hide))
!              (Info-fontify-node)))
!        (goto-char (point-min))
!        (if (setq p (search-forward (concat "*Note " curr-node "::") nil t))
!            (setq p (- p (length curr-node) 2)))
!        (current-buffer)))
!     (goto-char (or p (point-min)))))
! 
! (defun Info-insert-toc (nodes node-list level)
!   "Insert table of contents with references to nodes."
!   (let ((section "Top"))
!     (while nodes
!       (let ((node (assoc (car nodes) node-list)))
!         (unless (member (nth 1 node) (list nil section))
!           (insert (setq section (nth 1 node)) "\n"))
!         (insert (make-string level ?\t))
!         (insert "*Note " (car nodes) "::\n")
!         (Info-insert-toc (nth 2 node) node-list (1+ level))
!         (setq nodes (cdr nodes))))))
! 
! (defun Info-build-toc (file)
!   "Build table of contents from menus of Info FILE and its subfiles."
!   (if (equal file "dir")
!       (error "Table of contents for Info directory is not supported yet"))
!   (with-temp-buffer
!     (let ((default-directory (or (and (stringp file)
!                                       (file-name-directory
!                                        (setq file (Info-find-file file))))
!                                  default-directory))
!           (sections '(("Top" "Top")))
!           nodes subfiles)
!       (while (or file subfiles)
!         (or file (message "Searching subfile %s..." (car subfiles)))
!         (erase-buffer)
!         (info-insert-file-contents (or file (car subfiles)))
!         (while (and (search-forward "\n\^_\nFile:" nil 'move)
!                     (search-forward "Node: " nil 'move))
!           (let ((nodename (substring-no-properties (Info-following-node-name)))
!                 (bound (- (or (save-excursion (search-forward "\n\^_" nil t))
!                               (point-max)) 2))
!                 (section "Top")
!                 menu-items)
!             (when (and (not (string-match "\\<index\\>" nodename))
!                        (re-search-forward "^\\* Menu:" bound t))
!               (forward-line 1)
!               (beginning-of-line)
!               (setq bound (or (and (equal nodename "Top")
!                                    (save-excursion
!                                      (re-search-forward
!                                       "^[ \t-]*The Detailed Node Listing" nil t)))
!                               bound))
!               (while (< (point) bound)
!                 (cond
!                  ;; Menu item line
!                  ((looking-at "^\\* +[^:]+:")
!                   (beginning-of-line)
!                   (forward-char 2)
!                   (let ((menu-node-name (substring-no-properties
!                                          (Info-extract-menu-node-name))))
!                     (setq menu-items (cons menu-node-name menu-items))
!                     (if (equal nodename "Top")
!                         (setq sections
!                               (cons (list menu-node-name section) sections)))))
!                  ;; Other non-empty strings in the Top node are section names
!                  ((and (equal nodename "Top")
!                        (looking-at "^\\([^ \t\n*=.-][^:\n]*\\)"))
!                   (setq section (match-string-no-properties 1))))
!                 (forward-line 1)
!                 (beginning-of-line)))
!             (setq nodes (cons (list nodename
!                                     (cadr (assoc nodename sections))
!                                     (nreverse menu-items))
!                               nodes))
!             (goto-char bound)))
!         (if file
!             (save-excursion
!               (goto-char (point-min))
!               (if (search-forward "\n\^_\nIndirect:" nil t)
!                   (let ((bound (save-excursion (search-forward "\n\^_" nil t))))
!                     (while (re-search-forward "^\\(.*\\): [0-9]+$" bound t)
!                       (setq subfiles (cons (match-string-no-properties 1)
!                                            subfiles)))))
!               (setq subfiles (nreverse subfiles)
!                     file nil))
!           (setq subfiles (cdr subfiles))))
!       (message "")
!       (nreverse nodes))))
! \f
! (defun Info-follow-reference (footnotename &optional fork)
    "Follow cross reference named FOOTNOTENAME to the node it refers to.
! FOOTNOTENAME may be an abbreviation of the reference name.
! If FORK is non-nil (interactively with a prefix arg), show the node in
! a new info buffer.  If FORK is a string, it is the name to use for the
! new buffer."
    (interactive
     (let ((completion-ignore-case t)
  	 (case-fold-search t)
***************
*** 1502,1508 ****
         (setq bol (point))
  
         (goto-char (point-min))
!        (while (re-search-forward "\\*note[ \n\t]*\\([^:]*\\):" nil t)
  	 (setq str (match-string-no-properties 1))
  	 ;; See if this one should be the default.
  	 (and (null default)
--- 1753,1759 ----
         (setq bol (point))
  
         (goto-char (point-min))
!        (while (re-search-forward "\\*note[ \n\t]+\\([^:]*\\):" nil t)
  	 (setq str (match-string-no-properties 1))
  	 ;; See if this one should be the default.
  	 (and (null default)
***************
*** 1539,1545 ****
  					 "Follow reference named: ")
  				       completions nil t)))
  	   (list (if (equal input "")
! 		     default input)))
         (error "No cross-references in this node"))))
  
    (unless footnotename
--- 1790,1796 ----
  					 "Follow reference named: ")
  				       completions nil t)))
  	   (list (if (equal input "")
! 		     default input) current-prefix-arg))
         (error "No cross-references in this node"))))
  
    (unless footnotename
***************
*** 1551,1567 ****
        (setq str (concat (substring str 0 i) "[ \t\n]+" (substring str (1+ i))))
        (setq i (+ i 6)))
      (save-excursion
!       (goto-char (point-min))
!       (or (re-search-forward str nil t)
! 	  (error "No cross-reference named %s" footnotename))
!       (goto-char (+ (match-beginning 0) 5))
!       (setq target
! 	    (Info-extract-menu-node-name t)))
      (while (setq i (string-match "[ \t\n]+" target i))
        (setq target (concat (substring target 0 i) " "
  			   (substring target (match-end 0))))
        (setq i (+ i 1)))
!     (Info-goto-node target)))
  
  (defconst Info-menu-entry-name-re "\\(?:[^:]\\|:[^:,.;() \t\n]\\)*"
    ;; We allow newline because this is also used in Info-follow-reference,
--- 1802,1834 ----
        (setq str (concat (substring str 0 i) "[ \t\n]+" (substring str (1+ i))))
        (setq i (+ i 6)))
      (save-excursion
!       ;; Move point to the beginning of reference if point is on reference
!       (or (looking-at "\\*note[ \n\t]+")
!           (and (looking-back "\\*note[ \n\t]+")
!                (goto-char (match-beginning 0)))
!           (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))))
!                    (<= (point) (match-end 0)))
!               (goto-char (match-beginning 0))))
!       ;; Go to the reference closest to point
!       (let ((next-ref (save-excursion (and (re-search-forward str nil t)
!                                            (+ (match-beginning 0) 5))))
!             (prev-ref (save-excursion (and (re-search-backward str nil t)
!                                            (+ (match-beginning 0) 5)))))
!         (goto-char (cond ((and next-ref prev-ref)
!                           (if (< (abs (- next-ref (point)))
!                                  (abs (- prev-ref (point))))
!                               next-ref prev-ref))
!                          ((or next-ref prev-ref))
!                          ((error "No cross-reference named %s" footnotename))))
!         (setq target (Info-extract-menu-node-name t))))
      (while (setq i (string-match "[ \t\n]+" target i))
        (setq target (concat (substring target 0 i) " "
  			   (substring target (match-end 0))))
        (setq i (+ i 1)))
!     (Info-goto-node target fork)))
  
  (defconst Info-menu-entry-name-re "\\(?:[^:]\\|:[^:,.;() \t\n]\\)*"
    ;; We allow newline because this is also used in Info-follow-reference,
***************
*** 1968,1974 ****
  (defun Info-next-reference (&optional recur)
    "Move cursor to the next cross-reference or menu item in the node."
    (interactive)
!   (let ((pat "\\*note[ \n\t]*\\([^:]*\\):\\|^\\* .*:")
  	(old-pt (point))
  	(case-fold-search t))
      (or (eobp) (forward-char 1))
--- 2235,2241 ----
  (defun Info-next-reference (&optional recur)
    "Move cursor to the next cross-reference or menu item in the node."
    (interactive)
!   (let ((pat "\\*note[ \n\t]+\\([^:]+\\):\\|^\\* .*:\\|[hf]t?tp://")
  	(old-pt (point))
  	(case-fold-search t))
      (or (eobp) (forward-char 1))
***************
*** 1979,1985 ****
  	      (progn
  		(goto-char old-pt)
  		(error "No cross references in this node")))))
!     (goto-char (match-beginning 0))
      (if (looking-at "\\* Menu:")
  	(if recur
  	    (error "No cross references in this node")
--- 2246,2252 ----
  	      (progn
  		(goto-char old-pt)
  		(error "No cross references in this node")))))
!     (goto-char (or (match-beginning 1) (match-beginning 0)))
      (if (looking-at "\\* Menu:")
  	(if recur
  	    (error "No cross references in this node")
***************
*** 1988,1994 ****
  (defun Info-prev-reference (&optional recur)
    "Move cursor to the previous cross-reference or menu item in the node."
    (interactive)
!   (let ((pat "\\*note[ \n\t]*\\([^:]*\\):\\|^\\* .*:")
  	(old-pt (point))
  	(case-fold-search t))
      (or (re-search-backward pat nil t)
--- 2255,2261 ----
  (defun Info-prev-reference (&optional recur)
    "Move cursor to the previous cross-reference or menu item in the node."
    (interactive)
!   (let ((pat "\\*note[ \n\t]+\\([^:]+\\):\\|^\\* .*:\\|[hf]t?tp://")
  	(old-pt (point))
  	(case-fold-search t))
      (or (re-search-backward pat nil t)
***************
*** 1998,2004 ****
  	      (progn
  		(goto-char old-pt)
  		(error "No cross references in this node")))))
!     (goto-char (match-beginning 0))
      (if (looking-at "\\* Menu:")
  	(if recur
  	    (error "No cross references in this node")
--- 2265,2271 ----
  	      (progn
  		(goto-char old-pt)
  		(error "No cross references in this node")))))
!     (goto-char (or (match-beginning 1) (match-beginning 0)))
      (if (looking-at "\\* Menu:")
  	(if recur
  	    (error "No cross references in this node")
***************
*** 2209,2220 ****
         (save-excursion (forward-line 1) (eobp))
         (Info-next-preorder)))
  
! (defun Info-follow-nearest-node ()
    "Follow a node reference near point.
  If point is on a reference, follow that reference.  Otherwise,
  if point is in a menu item description, follow that menu item."
!   (interactive)
!   (or (Info-try-follow-nearest-node)
        (when (save-excursion
  	      (search-backward "\n* menu:" nil t))
  	(save-excursion
--- 2476,2487 ----
         (save-excursion (forward-line 1) (eobp))
         (Info-next-preorder)))
  
! (defun Info-follow-nearest-node (&optional fork)
    "Follow a node reference near point.
  If point is on a reference, follow that reference.  Otherwise,
  if point is in a menu item description, follow that menu item."
!   (interactive "P")
!   (or (Info-try-follow-nearest-node fork)
        (when (save-excursion
  	      (search-backward "\n* menu:" nil t))
  	(save-excursion
***************
*** 2223,2257 ****
  	    (beginning-of-line 0))
  	  (when (looking-at "\\* +\\([^\t\n]*\\):")
  	    (Info-goto-node
! 	     (Info-extract-menu-item (match-string-no-properties 1)))
  	    t)))
        (error "Point neither on reference nor in menu item description")))
  
  ;; Common subroutine.
! (defun Info-try-follow-nearest-node ()
    "Follow a node reference near point.  Return non-nil if successful."
    (let (node)
      (cond
!      ((setq node (Info-get-token (point) "\\*note[ \n]"
! 				 "\\*note[ \n]\\([^:]*\\):"))
!       (Info-follow-reference node))
       ;; menu item: node name
       ((setq node (Info-get-token (point) "\\* +" "\\* +\\([^:]*\\)::"))
!       (Info-goto-node node))
       ;; menu item: index entry
       ((Info-get-token (point) "\\* +" "\\* +\\(.*\\): ")
        (beginning-of-line)
        (forward-char 2)
        (setq node (Info-extract-menu-node-name))
!       (Info-goto-node node))
       ((setq node (Info-get-token (point) "Up: " "Up: \\([^,\n\t]*\\)"))
!       (Info-goto-node node))
       ((setq node (Info-get-token (point) "Next: " "Next: \\([^,\n\t]*\\)"))
!       (Info-goto-node node))
       ((setq node (Info-get-token (point) "File: " "File: \\([^,\n\t]*\\)"))
!       (Info-goto-node "Top"))
       ((setq node (Info-get-token (point) "Prev: " "Prev: \\([^,\n\t]*\\)"))
!       (Info-goto-node node)))
      node))
  \f
  (defvar Info-mode-map nil
--- 2490,2534 ----
  	    (beginning-of-line 0))
  	  (when (looking-at "\\* +\\([^\t\n]*\\):")
  	    (Info-goto-node
! 	     (Info-extract-menu-item (match-string-no-properties 1)) fork)
  	    t)))
        (error "Point neither on reference nor in menu item description")))
  
  ;; Common subroutine.
! (defun Info-try-follow-nearest-node (&optional fork)
    "Follow a node reference near point.  Return non-nil if successful."
    (let (node)
      (cond
!      ((and (Info-get-token (point) "[hf]t?tp://" "[hf]t?tp://\\([^ \t\n\"`({<>})']+\\)")
!            (or (featurep 'browse-url) (require 'browse-url nil t)))
!       (setq node t)
!       (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
       ((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))
!       (Info-goto-node node fork))
       ((setq node (Info-get-token (point) "Up: " "Up: \\([^,\n\t]*\\)"))
!       (Info-goto-node node fork))
       ((setq node (Info-get-token (point) "Next: " "Next: \\([^,\n\t]*\\)"))
!       (Info-goto-node node fork))
       ((setq node (Info-get-token (point) "File: " "File: \\([^,\n\t]*\\)"))
!       (Info-goto-node "Top" fork))
       ((setq node (Info-get-token (point) "Prev: " "Prev: \\([^,\n\t]*\\)"))
!       (Info-goto-node node fork)))
      node))
  \f
  (defvar Info-mode-map nil
***************
*** 2335,2344 ****
--- 2612,2629 ----
     ("Reference" ["You should never see this" report-emacs-bug t])
     ["Search..." Info-search
      :help "Search for regular expression in this Info file"]
+    ["Search Case-Sensitively..." Info-search-case-sensitively
+     :help "Search for regular expression case sensitively"]
+    ["Search Next" Info-search-next
+     :help "Search for another occurrence of regular expression"]
     ["Go to Node..." Info-goto-node
      :help "Go to a named node"]
     ["Last" Info-last :active Info-history
      :help "Go to the last node you were at"]
+    ["History" Info-history :active Info-history-list
+     :help "Go to the history buffer"]
+    ["Table of Contents" Info-toc
+     :help "Go to the buffer with a table of contents"]
     ("Index..."
      ["Lookup a String" Info-index
       :help "Look for a string in the index items"]
***************
*** 2348,2353 ****
--- 2633,2640 ----
      :active Info-enable-edit]
     ["Copy Node Name" Info-copy-current-node-name
      :help "Copy the name of the current node into the kill ring"]
+    ["Clone Info buffer" clone-buffer
+     :help "Create a twin copy of the current Info buffer."]
     ["Exit" Info-exit :help "Stop reading Info"]))
  
  
***************
*** 2403,2409 ****
  	      (case-fold-search t))
  	  (save-excursion
  	    (goto-char (point-min))
! 	    (while (re-search-forward "\\*note[ \n\t]*\\([^:]*\\):" nil t)
  	      (setq str (match-string 1))
  	      (setq i 0)
  	      (while (setq i (string-match "[ \n\t]+" str i))
--- 2690,2696 ----
  	      (case-fold-search t))
  	  (save-excursion
  	    (goto-char (point-min))
! 	    (while (re-search-forward "\\*note[ \n\t]+\\([^:]*\\):" nil t)
  	      (setq str (match-string 1))
  	      (setq i 0)
  	      (while (setq i (string-match "[ \n\t]+" str i))
***************
*** 2476,2481 ****
--- 2763,2770 ----
  \\[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.
+ \\[Info-history]	Go to the history buffer.
+ \\[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 `i' command.
  \\[Info-top-node]	Go to the Top node of this file.
***************
*** 2496,2501 ****
--- 2785,2791 ----
  
  Advanced commands:
  \\[Info-copy-current-node-name]	Put name of current info node in the kill ring.
+ \\[clone-buffer]	Select a new cloned Info buffer in another window.
  \\[Info-edit]	Edit contents of selected node.
  1	Pick first item in node's menu.
  2, 3, 4, 5   Pick second ... fifth item in node's menu.
***************
*** 2504,2509 ****
--- 2794,2803 ----
  \\[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.
+ \\[Info-search-case-sensitively]	Search through this Info file
+ 	  for specified regexp case-sensitively.
+ \\[Info-search-next]	Search for another occurrence of regexp
+ 	  from a previous `Info-search' command.
  \\[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)
***************
*** 2793,2809 ****
        (push (substring string start end) matches)
        (apply #'concat (nreverse matches)))))
  
- (defun Info-fontify-menu-headers ()
-   "Add the face `info-menu-header' to any header before a menu entry."
-   (save-excursion
-     (goto-char (point-min))
-     (when (re-search-forward "^\\* Menu:" nil t)
-       (put-text-property (match-beginning 0) (match-end 0)
- 			 'font-lock-face 'info-menu-header)
-       (while (re-search-forward "\n\n\\([^*\n ].*\\)\n\n?[*]" nil t)
- 	(put-text-property (match-beginning 1) (match-end 1)
- 			   'font-lock-face 'info-menu-header)))))
- 
  (defvar Info-next-link-keymap
    (let ((keymap (make-sparse-keymap)))
      (define-key keymap [header-line mouse-1] 'Info-next)
--- 3087,3092 ----
***************
*** 2833,3033 ****
    "Keymap to put on the Up link in the text or the header line.")
  
  (defun Info-fontify-node ()
!   ;; Only fontify the node if it hasn't already been done.
!   (unless (let ((where (next-property-change (point-min))))
!             (and where (not (= where (point-max)))))
!     (save-excursion
!       (let ((inhibit-read-only t)
! 	    (case-fold-search t)
! 	    paragraph-markers)
! 	(goto-char (point-min))
! 	(when (looking-at "^\\(File: [^,: \t]+,?[ \t]+\\)?")
! 	  (goto-char (match-end 0))
! 	  (while (looking-at "[ \t]*\\([^:, \t\n]+\\):[ \t]+\\([^:,\t\n]+\\),?")
! 	    (goto-char (match-end 0))
! 	    (let* ((nbeg (match-beginning 2))
! 		   (nend (match-end 2))
! 		   (tbeg (match-beginning 1))
! 		   (tag (match-string 1)))
! 	      (if (string-equal tag "Node")
! 		  (put-text-property nbeg nend 'font-lock-face 'info-header-node)
! 		(put-text-property nbeg nend 'font-lock-face 'info-header-xref)
! 		(put-text-property tbeg nend 'mouse-face 'highlight)
! 		(put-text-property tbeg nend
! 				   'help-echo
! 				   (concat "Go to node "
! 					   (buffer-substring nbeg nend)))
! 		;; Always set up the text property keymap.
! 		;; It will either be used in the buffer
! 		;; or copied in the header line.
! 		(put-text-property tbeg nend 'keymap
! 				   (cond
! 				    ((equal tag "Prev") Info-prev-link-keymap)
! 				    ((equal tag "Next") Info-next-link-keymap)
! 				    ((equal tag "Up") Info-up-link-keymap))))))
! 	  (when Info-use-header-line
! 	    (goto-char (point-min))
! 	    (let ((header-end (line-end-position))
! 		  header)
! 	      ;; If we find neither Next: nor Prev: link, show the entire
! 	      ;; node header.  Otherwise, don't show the File: and Node:
! 	      ;; parts, to avoid wasting precious space on information that
! 	      ;; is available in the mode line.
! 	      (if (re-search-forward
! 		   "\\(next\\|up\\|prev[ious]*\\): "
! 		   header-end t)
! 		  (progn
! 		    (goto-char (match-beginning 1))
! 		    (setq header (buffer-substring (point) header-end)))
! 		(if (re-search-forward "node:[ \t]*[^ \t]+[ \t]*" header-end t)
! 		    (setq header
! 			  (concat "No next, prev or up links  --  "
! 				  (buffer-substring (point) header-end)))
! 		  (setq header (buffer-substring (point) header-end))))
! 
! 	      (put-text-property (point-min) (1+ (point-min))
! 				 'header-line (Info-escape-percent header))
! 	      ;; Hide the part of the first line
! 	      ;; that is in the header, if it is just part.
! 	      (unless (bobp)
! 		;; Hide the punctuation at the end, too.
! 		(skip-chars-backward " \t,")
! 		(put-text-property (point) header-end 'invisible t)))))
! 	(goto-char (point-min))
! 	(while (re-search-forward "\n\\([^ \t\n].+\\)\n\\(\\*+\\|=+\\|-+\\|\\.+\\)$"
! 				  nil t)
! 	  (let* ((c (preceding-char))
! 		 (face
! 		  (cond ((= c ?*) 'Info-title-1-face)
! 			((= c ?=) 'Info-title-2-face)
! 			((= c ?-) 'Info-title-3-face)
! 			(t        'Info-title-4-face))))
! 	    (put-text-property (match-beginning 1) (match-end 1)
! 			       'font-lock-face face))
! 	  ;; This is a serious problem for trying to handle multiple
! 	  ;; 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 (1- (match-beginning 2)) (match-end 2)
! 				 '(invisible t front-sticky nil rear-nonsticky t))))
! 	(goto-char (point-min))
! 	(while (re-search-forward "\\(\\*Note[ \t]*\\)\n?[ \t]*\\([^:]*\\)\\(:[^.,:(]*\\(([^)]*)[^.,:]*\\)?[,:]?\n?\\)" nil t)
! 	  (unless (= (char-after (1- (match-beginning 0))) ?\") ; hack
! 	    (let ((start (match-beginning 0))
! 		  (next (point))
! 		  (hide-tag Info-hide-note-references)
! 		  other-tag)
! 	      (when hide-tag
! 		;; *Note is often used where *note should have been
! 		(goto-char start)
! 		(skip-syntax-backward " ")
! 		(setq other-tag
! 		      (cond ((memq (char-before) '(nil ?\. ?! ??))
! 			     "See ")
! 			    ((memq (char-before) '(?\, ?\; ?\: ?-))
! 			     "see ")
! 			    ((memq (char-before) '(?\( ?\[ ?\{))
! 			     ;; Check whether the paren is preceded by
! 			     ;; an end of sentence
! 			     (skip-syntax-backward " (")
! 			     (if (memq (char-before) '(nil ?\. ?! ??))
! 				 "See "
! 			       "see "))
! 			    ((save-match-data (looking-at "\n\n"))
! 			     "See ")))
! 		(goto-char next))
! 	      (if hide-tag
! 		  (add-text-properties (match-beginning 1) (match-end 1)
! 				       '(invisible t front-sticky nil rear-nonsticky t)))
! 	      (add-text-properties
! 	       (match-beginning 2) (match-end 2)
! 	       (cons 'help-echo
! 		     (cons (if (match-end 4)
! 			       (concat "mouse-2: go to " (match-string 4))
! 			     "mouse-2: go to this node")
! 			   '(font-lock-face info-xref
! 			     mouse-face highlight))))
! 	      (when (eq Info-hide-note-references t)
! 		(add-text-properties (match-beginning 3) (match-end 3)
! 				     '(invisible t front-sticky nil rear-nonsticky t)))
! 	      (when other-tag
! 		(save-excursion
! 		  (goto-char (match-beginning 1))
! 		  (insert other-tag)))
! 	      (when (and Info-refill-paragraphs
! 			 (or hide-tag (eq Info-hide-note-references t)))
! 		(push (set-marker (make-marker) start)
! 		      paragraph-markers)))))
! 
! 	(when (and Info-refill-paragraphs
! 		   paragraph-markers)
! 	  (let ((fill-nobreak-invisible t)
! 		(fill-individual-varying-indent nil)
! 		(paragraph-start "\f\\|[ \t]*[-*]\\|[ \t]*$")
! 		(paragraph-separate ".*\\.[ \t]*\n[ \t]\\|[ \t]*[-*]\\|[ \t\f]*$")
! 		(adaptive-fill-mode nil))
! 	    (goto-char (point-max))
! 	    (while paragraph-markers
! 	      (let ((m (car paragraph-markers)))
! 		(setq paragraph-markers (cdr paragraph-markers))
! 		(when (< m (point))
! 		  (goto-char m)
! 		  (beginning-of-line)
! 		  (let ((beg (point)))
! 		    (when (zerop (forward-paragraph))
! 		      (fill-individual-paragraphs beg (point) nil nil)
! 		      (goto-char beg))))
! 		(set-marker m nil)))))
  
! 	(goto-char (point-min))
! 	(when (and (search-forward "\n* Menu:" nil t)
! 		   (not (string-match "\\<Index\\>" Info-current-node))
! 		   ;; Don't take time to annotate huge menus
! 		   (< (- (point-max) (point)) Info-fontify-maximum-menu-size))
! 	  (let ((n 0)
! 		cont)
! 	    (while (re-search-forward
! 		    (concat "^\\* +\\(" Info-menu-entry-name-re "\\)\\(:"
! 			    Info-node-spec-re "\\([ \t]*\\)\\)")
! 		    nil t)
! 	      (setq n (1+ n))
! 	      (if (and (<= n 9) (zerop (% n 3))) ; visual aids to help with 1-9 keys
! 		  (put-text-property (match-beginning 0)
! 				     (1+ (match-beginning 0))
! 				     'font-lock-face 'info-menu-5))
! 	      (add-text-properties
! 	       (match-beginning 1) (match-end 1)
! 	       (cons 'help-echo
! 		     (cons
! 		      (if (match-end 3)
! 			  (concat "mouse-2: go to " (match-string 3))
! 			"mouse-2: go to this node")
! 		      '(font-lock-face info-xref
! 			mouse-face highlight))))
! 	      (when (eq Info-hide-note-references t)
! 		(put-text-property (match-beginning 2) (1- (match-end 6))
! 				   'invisible t)
! 		;; We need a stretchable space like :align-to but with
! 		;; a minimum value.
! 		(put-text-property (1- (match-end 6)) (match-end 6) 'display
! 				   (if (>= 22 (- (match-end 1)
! 						 (match-beginning 0)))
! 				       '(space :align-to 24)
! 				     '(space :width 2)))
! 		(setq cont (looking-at "."))
! 		(while (and (= (forward-line 1) 0)
! 			    (looking-at "\\([ \t]+\\)[^*\n]"))
! 		  (put-text-property (match-beginning 1) (1- (match-end 1))
! 				     'invisible t)
! 		  (put-text-property (1- (match-end 1)) (match-end 1)
! 				     'display
! 				     (if cont
! 					 '(space :align-to 26)
! 				       '(space :align-to 24)))
! 		  (setq cont t))))))
  
! 	(Info-fontify-menu-headers)
! 	(set-buffer-modified-p nil)))))
  \f
  
  ;; When an Info buffer is killed, make sure the associated tags buffer
--- 3116,3428 ----
    "Keymap to put on the Up link in the text or the header line.")
  
  (defun Info-fontify-node ()
!   "Fontify the node."
!   (save-excursion
!     (let* ((inhibit-read-only t)
!            (case-fold-search t)
!            paragraph-markers
!            (not-fontified-p ; the node hasn't already been fontified
!             (not (let ((where (next-property-change (point-min))))
!                    (and where (not (= where (point-max)))))))
!            (fontify-visited-p ; visited nodes need to be re-fontified
!             (and Info-fontify-visited-nodes
!                  ;; Don't take time to refontify visited nodes in huge nodes
!                  (< (- (point-max) (point-min)) Info-fontify-maximum-menu-size))))
  
!       ;; Fontify header line
!       (goto-char (point-min))
!       (when (and not-fontified-p (looking-at "^\\(File: [^,: \t]+,?[ \t]+\\)?"))
!         (goto-char (match-end 0))
!         (while (looking-at "[ \t]*\\([^:, \t\n]+\\):[ \t]+\\([^:,\t\n]+\\),?")
!           (goto-char (match-end 0))
!           (let* ((nbeg (match-beginning 2))
!                  (nend (match-end 2))
!                  (tbeg (match-beginning 1))
!                  (tag (match-string 1)))
!             (if (string-equal tag "Node")
!                 (put-text-property nbeg nend 'font-lock-face 'info-header-node)
!               (put-text-property nbeg nend 'font-lock-face 'info-header-xref)
!               (put-text-property tbeg nend 'mouse-face 'highlight)
!               (put-text-property tbeg nend
!                                  'help-echo
!                                  (concat "Go to node "
!                                          (buffer-substring nbeg nend)))
!               ;; Always set up the text property keymap.
!               ;; It will either be used in the buffer
!               ;; or copied in the header line.
!               (put-text-property tbeg nend 'keymap
!                                  (cond
!                                   ((equal tag "Prev") Info-prev-link-keymap)
!                                   ((equal tag "Next") Info-next-link-keymap)
!                                   ((equal tag "Up") Info-up-link-keymap))))))
!         (when Info-use-header-line
!           (goto-char (point-min))
!           (let ((header-end (line-end-position))
!                 header)
!             ;; If we find neither Next: nor Prev: link, show the entire
!             ;; node header.  Otherwise, don't show the File: and Node:
!             ;; parts, to avoid wasting precious space on information that
!             ;; is available in the mode line.
!             (if (re-search-forward
!                  "\\(next\\|up\\|prev[ious]*\\): "
!                  header-end t)
!                 (progn
!                   (goto-char (match-beginning 1))
!                   (setq header (buffer-substring (point) header-end)))
!               (if (re-search-forward "node:[ \t]*[^ \t]+[ \t]*" header-end t)
!                   (setq header
!                         (concat "No next, prev or up links  --  "
!                                 (buffer-substring (point) header-end)))
!                 (setq header (buffer-substring (point) header-end))))
!             (put-text-property (point-min) (1+ (point-min))
!                                'header-line (Info-escape-percent header))
!             ;; Hide the part of the first line
!             ;; that is in the header, if it is just part.
!             (unless (bobp)
!               ;; Hide the punctuation at the end, too.
!               (skip-chars-backward " \t,")
!               (put-text-property (point) header-end 'invisible t)))))
! 
!       ;; Fontify titles
!       (goto-char (point-min))
!       (when not-fontified-p
!         (while (re-search-forward "\n\\([^ \t\n].+\\)\n\\(\\*+\\|=+\\|-+\\|\\.+\\)$"
!                                   nil t)
!           (let* ((c (preceding-char))
!                  (face
!                   (cond ((= c ?*) 'Info-title-1-face)
!                         ((= c ?=) 'Info-title-2-face)
!                         ((= c ?-) 'Info-title-3-face)
!                         (t        'Info-title-4-face))))
!             (put-text-property (match-beginning 1) (match-end 1)
!                                'font-lock-face face))
!           ;; This is a serious problem for trying to handle multiple
!           ;; 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 (1- (match-beginning 2)) (match-end 2)
!                                  '(invisible t front-sticky nil rear-nonsticky t)))))
! 
!       ;; Fontify cross references
!       (goto-char (point-min))
!       (when (or not-fontified-p fontify-visited-p)
!         (while (re-search-forward "\\(\\*Note[ \n\t]+\\)\\([^:]*\\)\\(:[ \t]*\\([^.,:(]*\\)\\(\\(([^)]*)\\)[^.,:]*\\)?[,:]?\n?\\)" nil t)
!           (let ((start (match-beginning 0))
!                 (next (point))
!                 other-tag)
!             (when not-fontified-p
!               (when Info-hide-note-references
!                 ;; *Note is often used where *note should have been
!                 (goto-char start)
!                 (skip-syntax-backward " ")
!                 (setq other-tag
!                       (cond ((memq (char-before) '(nil ?\. ?! ??))
!                              "See ")
!                             ((memq (char-before) '(?\, ?\; ?\: ?-))
!                              "see ")
!                             ((memq (char-before) '(?\( ?\[ ?\{))
!                              ;; Check whether the paren is preceded by
!                              ;; an end of sentence
!                              (skip-syntax-backward " (")
!                              (if (memq (char-before) '(nil ?\. ?! ??))
!                                  "See "
!                                "see "))
!                             ((save-match-data (looking-at "\n\n"))
!                              "See ")))
!                 (goto-char next)
!                 (add-text-properties
!                  (match-beginning 1)
!                  (or (save-match-data
!                        ;; Don't hide \n after *Note
!                        (let ((start1 (match-beginning 1)))
!                          (if (string-match "\n" (match-string 1))
!                              (+ start1 (match-beginning 0)))))
!                      (match-end 1))
!                  (if (and other-tag (not (eq Info-hide-note-references 'hide)))
!                      `(display ,other-tag front-sticky nil rear-nonsticky t)
!                    '(invisible t front-sticky nil rear-nonsticky t))))
!               (add-text-properties
!                (match-beginning 2) (match-end 2)
!                (list
!                 'help-echo (if (or (match-end 5)
!                                    (not (equal (match-string 4) "")))
!                                (concat "mouse-2: go to " (or (match-string 5)
!                                                              (match-string 4)))
!                              "mouse-2: go to this node")
!                 'mouse-face 'highlight)))
!             (when (or not-fontified-p fontify-visited-p)
!               (add-text-properties
!                (match-beginning 2) (match-end 2)
!                (list
!                 'font-lock-face
!                 ;; Display visited nodes in a different face
!                 (if (and Info-fontify-visited-nodes
!                          (save-match-data
!                            (let* ((node (replace-regexp-in-string
!                                          "^[ \t]+" ""
!                                          (replace-regexp-in-string
!                                           "[ \t\n]+" " "
!                                           (or (match-string 5)
!                                               (and (not (equal (match-string 4) ""))
!                                                    (match-string 4))
!                                               (match-string 2)))))
!                                   (file (file-name-nondirectory
!                                          Info-current-file))
!                                   (hl Info-history-list)
!                                   res)
!                              (if (string-match "(\\([^)]+\\))\\([^)]*\\)" node)
!                                  (setq file (match-string 1 node)
!                                        node (if (equal (match-string 2 node) "")
!                                                 "Top"
!                                               (match-string 2 node))))
!                              (while hl
!                                (if (and (string-equal node (nth 1 (car hl)))
!                                         (string-equal file
!                                                       (file-name-nondirectory
!                                                        (nth 0 (car hl)))))
!                                    (setq res (car hl) hl nil)
!                                  (setq hl (cdr hl))))
!                              res))) 'info-xref-visited 'info-xref))))
!             (when not-fontified-p
!               (when (memq Info-hide-note-references '(t hide))
!                 (add-text-properties (match-beginning 3) (match-end 3)
!                                      '(invisible t front-sticky nil rear-nonsticky t))
!                 ;; Unhide the file name of an external reference in parens
!                 (if (match-string 6)
!                     (remove-text-properties (match-beginning 6) (match-end 6)
!                                             '(invisible t front-sticky nil rear-nonsticky t)))
!                 ;; Unhide newline because hidden newlines cause too long lines
!                 (save-match-data
!                   (let ((start3 (match-beginning 3)))
!                     (if (string-match "\n[ \t]*" (match-string 3))
!                         (remove-text-properties (+ start3 (match-beginning 0)) (+ start3 (match-end 0))
!                                                 '(invisible t front-sticky nil rear-nonsticky t))))))
!               (when (and Info-refill-paragraphs Info-hide-note-references)
!                 (push (set-marker (make-marker) start)
!                       paragraph-markers))))))
! 
!       ;; Refill paragraphs (experimental feature)
!       (when (and not-fontified-p
!                  Info-refill-paragraphs
!                  paragraph-markers)
!         (let ((fill-nobreak-invisible t)
!               (fill-individual-varying-indent nil)
!               (paragraph-start "\f\\|[ \t]*[-*]\\|[ \t]*$")
!               (paragraph-separate ".*\\.[ \t]*\n[ \t]\\|[ \t]*[-*]\\|[ \t\f]*$")
!               (adaptive-fill-mode nil))
!           (goto-char (point-max))
!           (while paragraph-markers
!             (let ((m (car paragraph-markers)))
!               (setq paragraph-markers (cdr paragraph-markers))
!               (when (< m (point))
!                 (goto-char m)
!                 (beginning-of-line)
!                 (let ((beg (point)))
!                   (when (zerop (forward-paragraph))
!                     (fill-individual-paragraphs beg (point) nil nil)
!                     (goto-char beg))))
!               (set-marker m nil)))))
! 
!       ;; Fontify menu items
!       (goto-char (point-min))
!       (when (and (or not-fontified-p fontify-visited-p)
!                  (search-forward "\n* Menu:" nil t)
!                  (not (string-match "\\<Index\\>" Info-current-node))
!                  ;; Don't take time to annotate huge menus
!                  (< (- (point-max) (point)) Info-fontify-maximum-menu-size))
!         (let ((n 0)
!               cont)
!           (while (re-search-forward
!                   (concat "^\\* +\\(" Info-menu-entry-name-re "\\)\\(:"
!                           Info-node-spec-re "\\([ \t]*\\)\\)")
!                   nil t)
!             (when not-fontified-p
!               (setq n (1+ n))
!               (if (and (<= n 9) (zerop (% n 3))) ; visual aids to help with 1-9 keys
!                   (put-text-property (match-beginning 0)
!                                      (1+ (match-beginning 0))
!                                      'font-lock-face 'info-menu-5)))
!             (when not-fontified-p
!               (add-text-properties
!                (match-beginning 1) (match-end 1)
!                (list
!                 'help-echo (if (match-end 3)
!                                (concat "mouse-2: go to " (match-string 3))
!                              "mouse-2: go to this node")
!                 'mouse-face 'highlight)))
!             (when (or not-fontified-p fontify-visited-p)
!               (add-text-properties
!                (match-beginning 1) (match-end 1)
!                (list
!                 'font-lock-face
!                 ;; Display visited menu items in a different face
!                 (if (and Info-fontify-visited-nodes
!                          (save-match-data
!                            (let ((node (if (equal (match-string 3) "")
!                                            (match-string 1)
!                                          (match-string 3)))
!                                  (file (file-name-nondirectory Info-current-file))
!                                  (hl Info-history-list)
!                                  res)
!                              (if (string-match "(\\([^)]+\\))\\([^)]*\\)" node)
!                                  (setq file (match-string 1 node)
!                                        node (if (equal (match-string 2 node) "")
!                                                 "Top"
!                                               (match-string 2 node))))
!                              (while hl
!                                (if (and (string-equal node (nth 1 (car hl)))
!                                         (string-equal file
!                                                       (file-name-nondirectory
!                                                        (nth 0 (car hl)))))
!                                    (setq res (car hl) hl nil)
!                                  (setq hl (cdr hl))))
!                              res))) 'info-xref-visited 'info-xref))))
!             (when (and not-fontified-p (memq Info-hide-note-references '(t hide)))
!               (put-text-property (match-beginning 2) (1- (match-end 6))
!                                  'invisible t)
!               ;; Unhide the file name in parens
!               (if (and (match-end 4) (not (eq (char-after (match-end 4)) ?.)))
!                   (remove-text-properties (match-beginning 4) (match-end 4)
!                                           '(invisible t)))
!               ;; We need a stretchable space like :align-to but with
!               ;; a minimum value.
!               (put-text-property (1- (match-end 6)) (match-end 6) 'display
!                                  (if (>= 22 (- (match-end 1)
!                                                (match-beginning 0)))
!                                      '(space :align-to 24)
!                                    '(space :width 2)))
!               (setq cont (looking-at "."))
!               (while (and (= (forward-line 1) 0)
!                           (looking-at "\\([ \t]+\\)[^*\n]"))
!                 (put-text-property (match-beginning 1) (1- (match-end 1))
!                                    'invisible t)
!                 (put-text-property (1- (match-end 1)) (match-end 1)
!                                    'display
!                                    (if cont
!                                        '(space :align-to 26)
!                                      '(space :align-to 24)))
!                 (setq cont t))))))
! 
!       ;; Fontify menu headers
!       ;; Add the face `info-menu-header' to any header before a menu entry
!       (goto-char (point-min))
!       (when (and not-fontified-p (re-search-forward "^\\* Menu:" nil t))
!         (put-text-property (match-beginning 0) (match-end 0)
!                            'font-lock-face 'info-menu-header)
!         (while (re-search-forward "\n\n\\([^*\n ].*\\)\n\n?[*]" nil t)
!           (put-text-property (match-beginning 1) (match-end 1)
!                              'font-lock-face 'info-menu-header)))
! 
!       ;; Fontify http and ftp references
!       (goto-char (point-min))
!       (when not-fontified-p
!         (while (re-search-forward "[hf]t?tp://[^ \t\n\"`({<>})']+" nil t)
!           (add-text-properties (match-beginning 0) (match-end 0)
!                                '(font-lock-face info-xref
!                                                 mouse-face highlight
!                                                 help-echo "mouse-2: go to this URL"))))
  
!       (set-buffer-modified-p nil))))
  \f
  
  ;; When an Info buffer is killed, make sure the associated tags buffer

-- 
Juri Linkov
http://www.jurta.org/emacs/

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-05  9:44 info.el Juri Linkov
@ 2004-04-06  0:20 ` Karl Berry
  2004-04-06  4:05   ` info.el Juri Linkov
  2004-04-06 12:51 ` info.el Jan Nieuwenhuizen
  1 sibling, 1 reply; 21+ messages in thread
From: Karl Berry @ 2004-04-06  0:20 UTC (permalink / raw)
  Cc: emacs-devel

    I still can't decide what is the best way to submit changes for

I think you made a reasonable compromise.  Certainly 33 separate
messages would be a pain, too.

I can't understand every change in detail, but I don't see anything
objectionable in this patch.

Besides the requirement for whitespace after *Note that we've discussed,
do any other changes have ramifications for the standalone Info reader?

Thanks,
karl

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-06  0:20 ` info.el Karl Berry
@ 2004-04-06  4:05   ` Juri Linkov
  0 siblings, 0 replies; 21+ messages in thread
From: Juri Linkov @ 2004-04-06  4:05 UTC (permalink / raw)
  Cc: emacs-devel

karl@freefriends.org (Karl Berry) writes:
> Besides the requirement for whitespace after *Note that we've discussed,
> do any other changes have ramifications for the standalone Info reader?

Some features were borrowed from the standalone Info reader, e.g.
preferring the reference closest to the point, using reference names
and case-sensitive search.  Some features are Emacs-specific.
But other features could be added to the standalone Info reader.

-- 
Juri Linkov
http://www.jurta.org/emacs/

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-05  9:44 info.el Juri Linkov
  2004-04-06  0:20 ` info.el Karl Berry
@ 2004-04-06 12:51 ` Jan Nieuwenhuizen
  2004-04-06 13:17   ` info.el Karl Berry
  1 sibling, 1 reply; 21+ messages in thread
From: Jan Nieuwenhuizen @ 2004-04-06 12:51 UTC (permalink / raw)
  Cc: karl, emacs-devel

Juri Linkov writes:

> I still can't decide what is the best way to submit changes for
> info.el.

Me neiter...

Anyone going to apply

   http://mail.gnu.org/archive/html/emacs-devel/2004-03/msg00821.html

this patch?

Jan.

-- 
Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond - The music typesetter
http://www.xs4all.nl/~jantien       | http://www.lilypond.org

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-06 12:51 ` info.el Jan Nieuwenhuizen
@ 2004-04-06 13:17   ` Karl Berry
  2004-04-08  4:05     ` info.el Juri Linkov
  0 siblings, 1 reply; 21+ messages in thread
From: Karl Berry @ 2004-04-06 13:17 UTC (permalink / raw)
  Cc: juri, emacs-devel

    Anyone going to apply

       http://mail.gnu.org/archive/html/emacs-devel/2004-03/msg00821.html

    this patch?

Jan, FWIW, I see no reason for you not to apply this on the trunk.

For the release branch -- rms, is it ok?  We already discussed it in
principle, hiding the magic info "cookies".  As I understand it, Eli was
waiting to hear confirmation from you before applying it there.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-06 13:17   ` info.el Karl Berry
@ 2004-04-08  4:05     ` Juri Linkov
  2004-04-08 12:44       ` info.el Jan Nieuwenhuizen
  2004-04-08 16:01       ` info.el Karl Berry
  0 siblings, 2 replies; 21+ messages in thread
From: Juri Linkov @ 2004-04-08  4:05 UTC (permalink / raw)
  Cc: emacs-devel, janneke

karl@freefriends.org (Karl Berry) writes:
>     Anyone going to apply
>
>        http://mail.gnu.org/archive/html/emacs-devel/2004-03/msg00821.html
>
>     this patch?
>
> Jan, FWIW, I see no reason for you not to apply this on the trunk.
>
> For the release branch -- rms, is it ok?  We already discussed it in
> principle, hiding the magic info "cookies".  As I understand it, Eli was
> waiting to hear confirmation from you before applying it there.

It was installed on HEAD, and it seems that installing it on the RC
branch is not needed if HEAD will be merged into RC branch for the
next Emacs release.

Karl, you already mentioned that the next Texinfo release will have
an index cookie and index line numbers.  Does the next Texinfo release
introduce other features that should be supported by Emacs?  Perhaps
all such changes should be added in Emacs only to HEAD.

-- 
Juri Linkov
http://www.jurta.org/emacs/

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-08  4:05     ` info.el Juri Linkov
@ 2004-04-08 12:44       ` Jan Nieuwenhuizen
  2004-04-08 15:40         ` info.el Stefan Monnier
  2004-04-08 16:01       ` info.el Karl Berry
  1 sibling, 1 reply; 21+ messages in thread
From: Jan Nieuwenhuizen @ 2004-04-08 12:44 UTC (permalink / raw)
  Cc: emacs-devel, Karl Berry

Juri Linkov writes:

> It was installed on HEAD, and it seems that installing it on the RC
> branch is not needed if HEAD will be merged into RC branch for the
> next Emacs release.

Thanks.  Sorry for whining.  Excuse my ignorance, but what is the
the 22.0/21.4 RC branch called, I never could seem to find id.

Jan.

-- 
Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond - The music typesetter
http://www.xs4all.nl/~jantien       | http://www.lilypond.org

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-08 12:44       ` info.el Jan Nieuwenhuizen
@ 2004-04-08 15:40         ` Stefan Monnier
  2004-04-08 15:57           ` info.el Jan Nieuwenhuizen
  0 siblings, 1 reply; 21+ messages in thread
From: Stefan Monnier @ 2004-04-08 15:40 UTC (permalink / raw)
  Cc: Juri Linkov, Karl Berry, emacs-devel

> Thanks.  Sorry for whining.  Excuse my ignorance, but what is the
> the 22.0/21.4 RC branch called, I never could seem to find id.

It's not called: it's the trunk.


        Stefan

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-08 15:40         ` info.el Stefan Monnier
@ 2004-04-08 15:57           ` Jan Nieuwenhuizen
  2004-04-08 17:21             ` info.el Stefan Monnier
  0 siblings, 1 reply; 21+ messages in thread
From: Jan Nieuwenhuizen @ 2004-04-08 15:57 UTC (permalink / raw)
  Cc: Juri Linkov, Karl Berry, emacs-devel

Stefan Monnier writes:

>> what is the the 22.0/21.4 RC branch called, I never could seem to
>> find id.
>
> It's not called: it's the trunk.

Hmm.  That explains I could not find it, but confuses me even more.
How to interpret Juri's comment:

    installing it on the RC branch is not needed if HEAD will be
    merged into RC branch

HEAD is to be merged into trunk?

Jan.

-- 
Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond - The music typesetter
http://www.xs4all.nl/~jantien       | http://www.lilypond.org

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-08  4:05     ` info.el Juri Linkov
  2004-04-08 12:44       ` info.el Jan Nieuwenhuizen
@ 2004-04-08 16:01       ` Karl Berry
  1 sibling, 0 replies; 21+ messages in thread
From: Karl Berry @ 2004-04-08 16:01 UTC (permalink / raw)
  Cc: emacs-devel, janneke

    if HEAD will be merged into RC branch for the
    next Emacs release.

I recall a message (I think from rms) saying that the 21.4 branch will
not be cut from HEAD, but rather from 21.3, for bug fixes only.  Hence
my confusion.  From Stefan's message, I gather it hasn't been done yet,
either way.

    Karl, you already mentioned that the next Texinfo release will have
    an index cookie and index line numbers.  Does the next Texinfo release
    introduce other features that should be supported by Emacs?  

No, that plus the @image output introduced in 4.6 is all, I believe.

Actually using the index line numbers is less important than the code
janneke has sent, to (a) understand the images, and (b) ignoring unknown
^@^H[... constructs.

Thanks,
karl

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-08 15:57           ` info.el Jan Nieuwenhuizen
@ 2004-04-08 17:21             ` Stefan Monnier
  0 siblings, 0 replies; 21+ messages in thread
From: Stefan Monnier @ 2004-04-08 17:21 UTC (permalink / raw)
  Cc: Juri Linkov, Karl Berry, emacs-devel

>     installing it on the RC branch is not needed if HEAD will be
>     merged into RC branch
> HEAD is to be merged into trunk?

Yes, people misuse HEAD all the time.  HEAD means "the latest revision on
a given branch".  But people inconsistently sometimes use it to refer
to the (HEAD of the) trunk.


        Stefan

^ permalink raw reply	[flat|nested] 21+ messages in thread

* info.el
@ 2004-04-11 17:20 Luc Teirlinck
  2004-04-11 17:26 ` info.el Luc Teirlinck
  2004-04-12  5:06 ` info.el Juri Linkov
  0 siblings, 2 replies; 21+ messages in thread
From: Luc Teirlinck @ 2004-04-11 17:20 UTC (permalink / raw)


The recent changes to info.el, in particular to Info-follow-reference,
do not seem to be able to handle references spread over two lines.

Do:

emacs -q
C-h i
g (elisp)nil and t

Where we see:

symbol whose name starts with a colon (`:').  See Constant
Variables.

Putting point on `Variables' gives the error message:

Info-follow-reference: No cross-reference named Constant
Variables

In other words, the newline gets wrongly considered to be a part of
the node name.  I do not believe that this problem can be more than a
few days old.  (I believe that I would have noticed it before
otherwise.)

With point in the "See Constant" part things work fine.

Sincerely,

Luc.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-11 17:20 info.el Luc Teirlinck
@ 2004-04-11 17:26 ` Luc Teirlinck
  2004-04-12  5:06 ` info.el Juri Linkov
  1 sibling, 0 replies; 21+ messages in thread
From: Luc Teirlinck @ 2004-04-11 17:26 UTC (permalink / raw)
  Cc: emacs-devel

>From my previous message:

   Putting point on `Variables' gives the error message:

I meant: 

Putting point on `Variables' and typing RETURN gives the error message:

Sincerely,

Luc.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2004-04-11 17:20 info.el Luc Teirlinck
  2004-04-11 17:26 ` info.el Luc Teirlinck
@ 2004-04-12  5:06 ` Juri Linkov
  1 sibling, 0 replies; 21+ messages in thread
From: Juri Linkov @ 2004-04-12  5:06 UTC (permalink / raw)
  Cc: emacs-devel

Luc Teirlinck <teirllm@dms.auburn.edu> writes:
> Putting point on `Variables' gives the error message:
>
> Info-follow-reference: No cross-reference named Constant
> Variables
>
> In other words, the newline gets wrongly considered to be a part of
> the node name.  I do not believe that this problem can be more than a
> few days old.  (I believe that I would have noticed it before
> otherwise.)
>
> With point in the "See Constant" part things work fine.

I didn't test this rare case yet, thanks for finding it out.  The
problem was that the function `Info-following-node-name-re' by default
don't allow newlines in Info node names.  I've just installed a fix.

BTW, while testing it, I have noticed another problem: putting point
on the final period after moving the cursor from left to right and
typing RET follows the reference, but putting point on the final
period after moving the cursor from right to left and typing RET gives
the error.  This is due to the text properties at this point:
'(invisible t front-sticky nil rear-nonsticky t).

I think this behavior is a bit confusing when cursor type is box,
because it _looks_ like the cursor is _over_ the final period.
And when moving the cursor to the same position from different
directions gives the different results, it seems wrong.

-- 
Juri Linkov
http://www.jurta.org/emacs/

^ permalink raw reply	[flat|nested] 21+ messages in thread

* info.el
@ 2005-08-04  0:29 Juri Linkov
  2005-08-04 20:46 ` info.el Richard M. Stallman
  0 siblings, 1 reply; 21+ messages in thread
From: Juri Linkov @ 2005-08-04  0:29 UTC (permalink / raw)


While updating info.texi, I took the opportunity to fix info.el:

1. Replaced `info' with upper-case `Info' where appropriate.
2. Renamed `info-menu-5' face to `info-menu-star'.
3. Grouped face definitions together.
4. Put the cursor on menu items in the same way as on cross-references,
   i.e. after moving the cursor to the next/previous menu item, skip `* '
   and put the cursor on the first letter of the menu item.
5. Fixed `info-apropos' to work exactly as `index-apropos' in the
   stand-alone Info reader.
6. Moved `w' to before `c' as the primary key mentioned in the Help buffer.
7. Removed `S' binding (`Info-search-case-sensitively') since it is not
   useful anymore with isearch working on the whole Info manual.
8. Added `^' binding to `Info-up' as a similar key binding in the Dired
   mode where it is bound to `dired-up-directory'.

Index: lisp/info.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/info.el,v
retrieving revision 1.437
diff -c -r1.437 info.el
*** lisp/info.el	19 Jul 2005 11:35:34 -0000	1.437
--- lisp/info.el	4 Aug 2005 00:27:15 -0000
***************
*** 25,31 ****
  
  ;;; Commentary:
  
! ;; Note that nowadays we expect info files to be made using makeinfo.
  ;; In particular we make these assumptions:
  ;;  - a menu item MAY contain colons but not colon-space ": "
  ;;  - a menu item ending with ": " (but not ":: ") is an index entry
--- 25,31 ----
  
  ;;; Commentary:
  
! ;; Note that nowadays we expect Info files to be made using makeinfo.
  ;; In particular we make these assumptions:
  ;;  - a menu item MAY contain colons but not colon-space ": "
  ;;  - a menu item ending with ": " (but not ":: ") is an index entry
***************
*** 44,63 ****
  
  
  (defvar Info-history nil
!   "Stack of info nodes user has visited.
  Each element of the stack is a list (FILENAME NODENAME BUFFERPOS).")
  
  (defvar Info-history-forward nil
!   "Stack of info nodes user has visited with `Info-history-back' command.
  Each element of the stack is a list (FILENAME NODENAME BUFFERPOS).")
  
  (defvar Info-history-list nil
!   "List of all info nodes user has visited.
  Each element of the list is a list (FILENAME NODENAME).")
  
  (defcustom Info-enable-edit nil
    "*Non-nil means the \\<Info-mode-map>\\[Info-edit] command in Info can edit the current node.
! This is convenient if you want to write info files by hand.
  However, we recommend that you not do this.
  It is better to write a Texinfo file and generate the Info file from that,
  because that gives you a printed manual as well."
--- 44,63 ----
  
  
  (defvar Info-history nil
!   "Stack of Info nodes user has visited.
  Each element of the stack is a list (FILENAME NODENAME BUFFERPOS).")
  
  (defvar Info-history-forward nil
!   "Stack of Info nodes user has visited with `Info-history-back' command.
  Each element of the stack is a list (FILENAME NODENAME BUFFERPOS).")
  
  (defvar Info-history-list nil
!   "List of all Info nodes user has visited.
  Each element of the list is a list (FILENAME NODENAME).")
  
  (defcustom Info-enable-edit nil
    "*Non-nil means the \\<Info-mode-map>\\[Info-edit] command in Info can edit the current node.
! This is convenient if you want to write Info files by hand.
  However, we recommend that you not do this.
  It is better to write a Texinfo file and generate the Info file from that,
  because that gives you a printed manual as well."
***************
*** 76,86 ****
    "Face for Info node names."
    :group 'info)
  
! (defface info-menu-5
    '((((class color)) :foreground "red1")
      (t :underline t))
    "Face for every third `*' in an Info menu."
    :group 'info)
  
  (defface info-xref
    '((((min-colors 88)
--- 76,132 ----
    "Face for Info node names."
    :group 'info)
  
! (defface info-title-1
!   '((((type tty pc) (class color) (background light))
!      :foreground "green" :weight bold)
!     (((type tty pc) (class color) (background dark))
!      :foreground "yellow" :weight bold)
!     (t :height 1.2 :inherit info-title-2))
!   "Face for info titles at level 1."
!   :group 'info)
! ;; backward-compatibility alias
! (put 'Info-title-1-face 'face-alias 'info-title-1)
! 
! (defface info-title-2
!   '((((type tty pc) (class color)) :foreground "lightblue" :weight bold)
!     (t :height 1.2 :inherit info-title-3))
!   "Face for info titles at level 2."
!   :group 'info)
! ;; backward-compatibility alias
! (put 'Info-title-2-face 'face-alias 'info-title-2)
! 
! (defface info-title-3
!   '((((type tty pc) (class color)) :weight bold)
!     (t :height 1.2 :inherit info-title-4))
!   "Face for info titles at level 3."
!   :group 'info)
! ;; backward-compatibility alias
! (put 'Info-title-3-face 'face-alias 'info-title-3)
! 
! (defface info-title-4
!   '((((type tty pc) (class color)) :weight bold)
!     (t :weight bold :inherit variable-pitch))
!   "Face for info titles at level 4."
!   :group 'info)
! ;; backward-compatibility alias
! (put 'Info-title-4-face 'face-alias 'info-title-4)
! 
! (defface info-menu-header
!   '((((type tty pc))
!      :underline t
!      :weight bold)
!     (t
!      :inherit variable-pitch
!      :weight bold))
!   "Face for headers in Info menus."
!   :group 'info)
! 
! (defface info-menu-star
    '((((class color)) :foreground "red1")
      (t :underline t))
    "Face for every third `*' in an Info menu."
    :group 'info)
+ (put 'info-menu-5 'face-alias 'info-menu-star)
  
  (defface info-xref
    '((((min-colors 88)
***************
*** 101,107 ****
    :group 'info)
  
  (defcustom Info-fontify-visited-nodes t
!   "*Non-nil means to fontify visited nodes in a different face."
    :version "22.1"
    :type 'boolean
    :group 'info)
--- 147,153 ----
    :group 'info)
  
  (defcustom Info-fontify-visited-nodes t
!   "*Non-nil means to fontify references to visited nodes in a different face."
    :version "22.1"
    :type 'boolean
    :group 'info)
***************
*** 165,170 ****
--- 211,217 ----
  
  (defcustom Info-scroll-prefer-subnodes nil
    "*If non-nil, \\<Info-mode-map>\\[Info-scroll-up] in a menu visits subnodes.
+ 
  If this is non-nil, and you scroll far enough in a node that its menu
  appears on the screen, the next \\<Info-mode-map>\\[Info-scroll-up]
  moves to a subnode indicated by the following menu item.  This means
***************
*** 180,186 ****
  (defcustom Info-hide-note-references t
    "*If non-nil, hide the tag and section reference in *note and * menu items.
  If value is non-nil but not `hide', also replaces the \"*note\" with \"see\".
! If value is non-nil but not t or `hide', the reference section is still shown."
    :version "22.1"
    :type '(choice (const :tag "No hiding" nil)
  		 (const :tag "Replace tag and hide reference" t)
--- 227,234 ----
  (defcustom Info-hide-note-references t
    "*If non-nil, hide the tag and section reference in *note and * menu items.
  If value is non-nil but not `hide', also replaces the \"*note\" with \"see\".
! If value is non-nil but not t or `hide', the reference section is still shown.
! `nil' completely disables this feature."
    :version "22.1"
    :type '(choice (const :tag "No hiding" nil)
  		 (const :tag "Replace tag and hide reference" t)
***************
*** 190,196 ****
  
  (defcustom Info-refill-paragraphs nil
    "*If non-nil, attempt to refill paragraphs with hidden references.
! This refilling may accidentally remove explicit line breaks in the info
  file, so be prepared for a few surprises if you enable this feature."
    :version "22.1"
    :type 'boolean
--- 238,244 ----
  
  (defcustom Info-refill-paragraphs nil
    "*If non-nil, attempt to refill paragraphs with hidden references.
! This refilling may accidentally remove explicit line breaks in the Info
  file, so be prepared for a few surprises if you enable this feature."
    :version "22.1"
    :type 'boolean
***************
*** 247,253 ****
  
  (defvar Info-current-subfile nil
    "Info subfile that is actually in the *info* buffer now.
! nil if current info file is not split into subfiles.")
  
  (defvar Info-current-node nil
    "Name of node that Info is now looking at, or nil.")
--- 295,301 ----
  
  (defvar Info-current-subfile nil
    "Info subfile that is actually in the *info* buffer now.
! nil if current Info file is not split into subfiles.")
  
  (defvar Info-current-node nil
    "Name of node that Info is now looking at, or nil.")
***************
*** 357,363 ****
         (not (file-directory-p filename))))
  
  (defun info-insert-file-contents (filename &optional visit)
!   "Insert the contents of an info file in the current buffer.
  Do the right thing if the file has been compressed or zipped."
    (let* ((tail Info-suffix-list)
  	 (lfn (if (fboundp 'msdos-long-file-names)
--- 405,411 ----
         (not (file-directory-p filename))))
  
  (defun info-insert-file-contents (filename &optional visit)
!   "Insert the contents of an Info file in the current buffer.
  Do the right thing if the file has been compressed or zipped."
    (let* ((tail Info-suffix-list)
  	 (lfn (if (fboundp 'msdos-long-file-names)
***************
*** 632,643 ****
          filename)))
  
  (defun Info-find-node (filename nodename &optional no-going-back)
!   "Go to an info node specified as separate FILENAME and NODENAME.
  NO-GOING-BACK is non-nil if recovering from an error in this function;
  it says do not attempt further (recursive) error recovery."
    (info-initialize)
    (setq filename (Info-find-file filename))
!   ;; Go into info buffer.
    (or (eq major-mode 'Info-mode) (pop-to-buffer "*info*"))
    ;; Record the node we are leaving.
    (if (and Info-current-file (not no-going-back))
--- 680,691 ----
          filename)))
  
  (defun Info-find-node (filename nodename &optional no-going-back)
!   "Go to an Info node specified as separate FILENAME and NODENAME.
  NO-GOING-BACK is non-nil if recovering from an error in this function;
  it says do not attempt further (recursive) error recovery."
    (info-initialize)
    (setq filename (Info-find-file filename))
!   ;; Go into Info buffer.
    (or (eq major-mode 'Info-mode) (pop-to-buffer "*info*"))
    ;; Record the node we are leaving.
    (if (and Info-current-file (not no-going-back))
***************
*** 647,653 ****
    (Info-find-node-2 filename nodename no-going-back))
  
  (defun Info-on-current-buffer (&optional nodename)
!   "Use the `Info-mode' to browse the current info buffer.
  If a prefix arg is provided, it queries for the NODENAME which
  else defaults to \"Top\"."
    (interactive
--- 695,701 ----
    (Info-find-node-2 filename nodename no-going-back))
  
  (defun Info-on-current-buffer (&optional nodename)
!   "Use the `Info-mode' to browse the current Info buffer.
  If a prefix arg is provided, it queries for the NODENAME which
  else defaults to \"Top\"."
    (interactive
***************
*** 665,671 ****
  ;; makeinfo-buffer) out of the way of normal operations.
  ;;
  (defun Info-revert-find-node (filename nodename)
!   "Go to an info node FILENAME and NODENAME, re-reading disk contents.
  When *info* is already displaying FILENAME and NODENAME, the window position
  is preserved, if possible."
    (pop-to-buffer "*info*")
--- 713,719 ----
  ;; makeinfo-buffer) out of the way of normal operations.
  ;;
  (defun Info-revert-find-node (filename nodename)
!   "Go to an Info node FILENAME and NODENAME, re-reading disk contents.
  When *info* is already displaying FILENAME and NODENAME, the window position
  is preserved, if possible."
    (pop-to-buffer "*info*")
***************
*** 1286,1292 ****
      (set-buffer-modified-p nil)))
  
  (defun Info-select-node ()
!   "Select the info node that point is in."
    ;; Bind this in case the user sets it to nil.
    (let ((case-fold-search t))
      (save-excursion
--- 1334,1340 ----
      (set-buffer-modified-p nil)))
  
  (defun Info-select-node ()
!   "Select the Info node that point is in."
    ;; Bind this in case the user sets it to nil.
    (let ((case-fold-search t))
      (save-excursion
***************
*** 1342,1361 ****
  			") "
  			(or Info-current-node ""))))))
  \f
! ;; Go to an info node specified with a filename-and-nodename string
  ;; of the sort that is found in pointers in nodes.
  
  ;; Don't autoload this function: the correct entry point for other packages
  ;; to use is `info'.  --Stef
  ;; ;;;###autoload
  (defun Info-goto-node (nodename &optional fork)
!   "Go to info node named NODENAME.  Give just NODENAME or (FILENAME)NODENAME.
  If NODENAME is of the form (FILENAME)NODENAME, the node is in the Info file
  FILENAME; otherwise, NODENAME should be in the current Info file (or one of
  its sub-files).
  Completion is available, but only for node names in the current Info file.
  If FORK is non-nil (interactively with a prefix arg), show the node in
! a new info buffer.
  If FORK is a string, it is the name to use for the new buffer."
    (interactive (list (Info-read-node-name "Go to node: ") current-prefix-arg))
    (info-initialize)
--- 1390,1409 ----
  			") "
  			(or Info-current-node ""))))))
  \f
! ;; Go to an Info node specified with a filename-and-nodename string
  ;; of the sort that is found in pointers in nodes.
  
  ;; Don't autoload this function: the correct entry point for other packages
  ;; to use is `info'.  --Stef
  ;; ;;;###autoload
  (defun Info-goto-node (nodename &optional fork)
!   "Go to Info node named NODENAME.  Give just NODENAME or (FILENAME)NODENAME.
  If NODENAME is of the form (FILENAME)NODENAME, the node is in the Info file
  FILENAME; otherwise, NODENAME should be in the current Info file (or one of
  its sub-files).
  Completion is available, but only for node names in the current Info file.
  If FORK is non-nil (interactively with a prefix arg), show the node in
! a new Info buffer.
  If FORK is a string, it is the name to use for the new buffer."
    (interactive (list (Info-read-node-name "Go to node: ") current-prefix-arg))
    (info-initialize)
***************
*** 1401,1407 ****
  	  ;; include it.
  	  (and (or (null (file-name-extension file))
  		   (string-match suffix file))
! 	       ;; But exclude subfiles of split info files.
  	       (not (string-match "-[0-9]+\\'" file))
  	       ;; And exclude backup files.
  	       (not (string-match "~\\'" file))
--- 1449,1455 ----
  	  ;; include it.
  	  (and (or (null (file-name-extension file))
  		   (string-match suffix file))
! 	       ;; But exclude subfiles of split Info files.
  	       (not (string-match "-[0-9]+\\'" file))
  	       ;; And exclude backup files.
  	       (not (string-match "~\\'" file))
***************
*** 1821,1827 ****
                  (concat "\n\\* +\\(" (regexp-quote old-node)
                          ":\\|[^:]+: +" (regexp-quote old-node) "\\)"))
                nil t))
!         (beginning-of-line)
        (goto-char p)
        (Info-restore-point Info-history))))
  
--- 1869,1875 ----
                  (concat "\n\\* +\\(" (regexp-quote old-node)
                          ":\\|[^:]+: +" (regexp-quote old-node) "\\)"))
                nil t))
!         (progn (beginning-of-line) (if (looking-at "^\\* ") (forward-char 2)))
        (goto-char p)
        (Info-restore-point Info-history))))
  
***************
*** 2010,2016 ****
    "Follow cross reference named FOOTNOTENAME to the node it refers to.
  FOOTNOTENAME may be an abbreviation of the reference name.
  If FORK is non-nil (interactively with a prefix arg), show the node in
! a new info buffer.  If FORK is a string, it is the name to use for the
  new buffer."
    (interactive
     (let ((completion-ignore-case t)
--- 2058,2064 ----
    "Follow cross reference named FOOTNOTENAME to the node it refers to.
  FOOTNOTENAME may be an abbreviation of the reference name.
  If FORK is non-nil (interactively with a prefix arg), show the node in
! a new Info buffer.  If FORK is a string, it is the name to use for the
  new buffer."
    (interactive
     (let ((completion-ignore-case t)
***************
*** 2221,2227 ****
  The menu item should one of those listed in the current node's menu.
  Completion is allowed, and the default menu item is the one point is on.
  If FORK is non-nil (interactively with a prefix arg), show the node in
! a new info buffer.  If FORK is a string, it is the name to use for the
  new buffer."
    (interactive
     (let ((completions '())
--- 2269,2275 ----
  The menu item should one of those listed in the current node's menu.
  Completion is allowed, and the default menu item is the one point is on.
  If FORK is non-nil (interactively with a prefix arg), show the node in
! a new Info buffer.  If FORK is a string, it is the name to use for the
  new buffer."
    (interactive
     (let ((completions '())
***************
*** 2546,2552 ****
      (if (looking-at "\\* Menu:")
  	(if recur
  	    (error "No cross references in this node")
! 	  (Info-next-reference t)))))
  
  (defun Info-prev-reference (&optional recur)
    "Move cursor to the previous cross-reference or menu item in the node."
--- 2594,2602 ----
      (if (looking-at "\\* Menu:")
  	(if recur
  	    (error "No cross references in this node")
! 	  (Info-next-reference t))
!       (if (looking-at "^\\* ")
! 	  (forward-char 2)))))
  
  (defun Info-prev-reference (&optional recur)
    "Move cursor to the previous cross-reference or menu item in the node."
***************
*** 2565,2571 ****
      (if (looking-at "\\* Menu:")
  	(if recur
  	    (error "No cross references in this node")
! 	  (Info-prev-reference t)))))
  \f
  (defvar Info-index-nodes nil
    "Alist of cached index node names of visited Info files.
--- 2615,2623 ----
      (if (looking-at "\\* Menu:")
  	(if recur
  	    (error "No cross references in this node")
! 	  (Info-prev-reference t))
!       (if (looking-at "^\\* ")
! 	  (forward-char 2)))))
  \f
  (defvar Info-index-nodes nil
    "Alist of cached index node names of visited Info files.
***************
*** 2799,2823 ****
  	(goto-char (point-min))
  	(re-search-forward "\\* Menu: *\n" nil t)
  	(while (re-search-forward "\\*.*: *(\\([^)]+\\))" nil t)
! 	  (add-to-list 'manuals (match-string 1)))
! 	(dolist (manual manuals)
  	  (message "Searching %s" manual)
! 	  (if (setq nodes (Info-index-nodes (Info-find-file manual)))
!               (condition-case nil
                    (save-excursion
                      (Info-find-node manual (car nodes))
                      (while
                          (progn
                            (goto-char (point-min))
                            (while (re-search-forward pattern nil t)
!                             (add-to-list 'matches
!                                          (list manual
!                                                (match-string-no-properties 1)
!                                                (match-string-no-properties 2)
!                                                (match-string-no-properties 3))))
                            (setq nodes (cdr nodes) node (car nodes)))
!                       (Info-goto-node node)))
!                 (error nil)))))
        (Info-goto-node (concat "(" current-file ")" current-node))
        (setq Info-history ohist
  	    Info-history-list ohist-list)
--- 2851,2879 ----
  	(goto-char (point-min))
  	(re-search-forward "\\* Menu: *\n" nil t)
  	(while (re-search-forward "\\*.*: *(\\([^)]+\\))" nil t)
! 	  (setq manuals (cons (match-string 1) manuals)))
! 	(dolist (manual (nreverse manuals))
  	  (message "Searching %s" manual)
! 	  (condition-case err
! 	      (if (setq nodes (Info-index-nodes (Info-find-file manual)))
                    (save-excursion
                      (Info-find-node manual (car nodes))
                      (while
                          (progn
                            (goto-char (point-min))
                            (while (re-search-forward pattern nil t)
! 			    (setq matches
! 				  (cons (list manual
! 					      (match-string-no-properties 1)
! 					      (match-string-no-properties 2)
! 					      (match-string-no-properties 3))
! 					matches)))
                            (setq nodes (cdr nodes) node (car nodes)))
!                       (Info-goto-node node))))
! 	    (error
! 	     (message "%s" (if (eq (car-safe err) 'error)
! 			       (nth 1 err) err))
! 	     (sit-for 1 t)))))
        (Info-goto-node (concat "(" current-file ")" current-node))
        (setq Info-history ohist
  	    Info-history-list ohist-list)
***************
*** 2827,2834 ****
  	(with-current-buffer (get-buffer-create " *info-apropos*")
  	  (erase-buffer)
  	  (insert "\n\^_\nFile: apropos, Node: Index, Up: (dir)\n")
! 	  (insert "* Menu: \nNodes whose indices contain \"" string "\"\n\n")
! 	  (dolist (entry matches)
  	    (insert
  	     (format "* %-38s (%s)%s.%s\n"
  		     (concat (nth 1 entry) " [" (nth 0 entry) "]:")
--- 2883,2890 ----
  	(with-current-buffer (get-buffer-create " *info-apropos*")
  	  (erase-buffer)
  	  (insert "\n\^_\nFile: apropos, Node: Index, Up: (dir)\n")
! 	  (insert "* Menu: \nNodes whose indices contain `" string "':\n\n")
! 	  (dolist (entry (nreverse matches))
  	    (insert
  	     (format "* %-38s (%s)%s.%s\n"
  		     (concat (nth 1 entry) " [" (nth 0 entry) "]:")
***************
*** 3001,3006 ****
--- 3057,3064 ----
    (define-key Info-mode-map "<" 'Info-top-node)
    (define-key Info-mode-map ">" 'Info-final-node)
    (define-key Info-mode-map "b" 'beginning-of-buffer)
+   ;; `w' is for consistency with dired-copy-filename-as-kill.
+   (define-key Info-mode-map "w" 'Info-copy-current-node-name)
    (define-key Info-mode-map "c" 'Info-copy-current-node-name)
    (define-key Info-mode-map "d" 'Info-directory)
    (define-key Info-mode-map "e" 'Info-edit)
***************
*** 3016,3030 ****
    (define-key Info-mode-map "q" 'Info-exit)
    (define-key Info-mode-map "r" 'Info-history-forward)
    (define-key Info-mode-map "s" 'Info-search)
-   (define-key Info-mode-map "S" 'Info-search-case-sensitively)
    ;; For consistency with Rmail.
    (define-key Info-mode-map "\M-s" 'Info-search)
    (define-key Info-mode-map "\M-n" 'clone-buffer)
    (define-key Info-mode-map "t" 'Info-top-node)
    (define-key Info-mode-map "T" 'Info-toc)
    (define-key Info-mode-map "u" 'Info-up)
!   ;; For consistency with dired-copy-filename-as-kill.
!   (define-key Info-mode-map "w" 'Info-copy-current-node-name)
    (define-key Info-mode-map "," 'Info-index-next)
    (define-key Info-mode-map "\177" 'Info-scroll-down)
    (define-key Info-mode-map [mouse-2] 'Info-mouse-follow-nearest-node)
--- 3074,3086 ----
    (define-key Info-mode-map "q" 'Info-exit)
    (define-key Info-mode-map "r" 'Info-history-forward)
    (define-key Info-mode-map "s" 'Info-search)
    ;; For consistency with Rmail.
    (define-key Info-mode-map "\M-s" 'Info-search)
    (define-key Info-mode-map "\M-n" 'clone-buffer)
    (define-key Info-mode-map "t" 'Info-top-node)
    (define-key Info-mode-map "T" 'Info-toc)
    (define-key Info-mode-map "u" 'Info-up)
!   (define-key Info-mode-map "^" 'Info-up)
    (define-key Info-mode-map "," 'Info-index-next)
    (define-key Info-mode-map "\177" 'Info-scroll-down)
    (define-key Info-mode-map [mouse-2] 'Info-mouse-follow-nearest-node)
***************
*** 3039,3045 ****
  
  (easy-menu-define
   Info-mode-menu Info-mode-map
!  "Menu for info files."
   '("Info"
     ["Up" Info-up :active (Info-check-pointer "up")
      :help "Go up in the Info tree"]
--- 3095,3101 ----
  
  (easy-menu-define
   Info-mode-menu Info-mode-map
!  "Menu for Info files."
   '("Info"
     ["Up" Info-up :active (Info-check-pointer "up")
      :help "Go up in the Info tree"]
***************
*** 3174,3185 ****
  
  \f
  (defun Info-copy-current-node-name (&optional arg)
!   "Put the name of the current info node into the kill ring.
! The name of the info file is prepended to the node name in parentheses.
  With a zero prefix arg, put the name inside a function call to `info'."
    (interactive "P")
    (unless Info-current-node
!     (error "No current info node"))
    (let ((node (concat "(" (file-name-nondirectory
                             (or (and (stringp Info-current-file)
                                      Info-current-file)
--- 3230,3241 ----
  
  \f
  (defun Info-copy-current-node-name (&optional arg)
!   "Put the name of the current Info node into the kill ring.
! The name of the Info file is prepended to the node name in parentheses.
  With a zero prefix arg, put the name inside a function call to `info'."
    (interactive "P")
    (unless Info-current-node
!     (error "No current Info node"))
    (let ((node (concat "(" (file-name-nondirectory
                             (or (and (stringp Info-current-file)
                                      Info-current-file)
***************
*** 3245,3251 ****
  \\[beginning-of-buffer]	Go to beginning of node.
  
  Advanced commands:
! \\[Info-copy-current-node-name]	Put name of current info node in the kill ring.
  \\[clone-buffer]	Select a new cloned Info buffer in another window.
  \\[Info-edit]	Edit contents of selected node.
  1 .. 9	Pick first ... ninth item in node's menu.
--- 3301,3307 ----
  \\[beginning-of-buffer]	Go to beginning of node.
  
  Advanced commands:
! \\[Info-copy-current-node-name]	Put name of current Info node in the kill ring.
  \\[clone-buffer]	Select a new cloned Info buffer in another window.
  \\[Info-edit]	Edit contents of selected node.
  1 .. 9	Pick first ... ninth item in node's menu.
***************
*** 3355,3361 ****
  Allowed only if variable `Info-enable-edit' is non-nil."
    (interactive)
    (or Info-enable-edit
!       (error "Editing info nodes is not enabled"))
    (Info-edit-mode)
    (message "%s" (substitute-command-keys
  		 "Editing: Type \\<Info-edit-map>\\[Info-cease-edit] to return to info")))
--- 3411,3417 ----
  Allowed only if variable `Info-enable-edit' is non-nil."
    (interactive)
    (or Info-enable-edit
!       (error "Editing Info nodes is not enabled"))
    (Info-edit-mode)
    (message "%s" (substitute-command-keys
  		 "Editing: Type \\<Info-edit-map>\\[Info-cease-edit] to return to info")))
***************
*** 3417,3423 ****
  			  "\\( <[0-9]+>\\)?:\\s *\\(.*\\)\\."
  			  "\\(?:[ \t\n]+(line +\\([0-9]+\\))\\)?"))
  	(info-file "emacs"))		;default
!     ;; Determine which info file this command is documented in.
      (if (get command 'info-file)
  	(setq info-file (get command 'info-file))
        ;; If it doesn't say explicitly, test its name against
--- 3473,3479 ----
  			  "\\( <[0-9]+>\\)?:\\s *\\(.*\\)\\."
  			  "\\(?:[ \t\n]+(line +\\([0-9]+\\))\\)?"))
  	(info-file "emacs"))		;default
!     ;; Determine which Info file this command is documented in.
      (if (get command 'info-file)
  	(setq info-file (get command 'info-file))
        ;; If it doesn't say explicitly, test its name against
***************
*** 3526,3576 ****
  	  (t
  	   (Info-goto-emacs-command-node command)))))
  \f
- (defface info-title-1
-   '((((type tty pc) (class color) (background light))
-      :foreground "green" :weight bold)
-     (((type tty pc) (class color) (background dark))
-      :foreground "yellow" :weight bold)
-     (t :height 1.2 :inherit info-title-2))
-   "Face for info titles at level 1."
-   :group 'info)
- ;; backward-compatibility alias
- (put 'Info-title-1-face 'face-alias 'info-title-1)
- 
- (defface info-title-2
-   '((((type tty pc) (class color)) :foreground "lightblue" :weight bold)
-     (t :height 1.2 :inherit info-title-3))
-   "Face for info titles at level 2."
-   :group 'info)
- ;; backward-compatibility alias
- (put 'Info-title-2-face 'face-alias 'info-title-2)
- 
- (defface info-title-3
-   '((((type tty pc) (class color)) :weight bold)
-     (t :height 1.2 :inherit info-title-4))
-   "Face for info titles at level 3."
-   :group 'info)
- ;; backward-compatibility alias
- (put 'Info-title-3-face 'face-alias 'info-title-3)
- 
- (defface info-title-4
-   '((((type tty pc) (class color)) :weight bold)
-     (t :weight bold :inherit variable-pitch))
-   "Face for info titles at level 4."
-   :group 'info)
- ;; backward-compatibility alias
- (put 'Info-title-4-face 'face-alias 'info-title-4)
- 
- (defface info-menu-header
-   '((((type tty pc))
-      :underline t
-      :weight bold)
-     (t
-      :inherit variable-pitch
-      :weight bold))
-   "Face for headers in Info menus."
-   :group 'info)
- 
  (defun Info-escape-percent (string)
    "Double all occurrences of `%' in STRING.
  
--- 3582,3587 ----
***************
*** 3867,3873 ****
  		(if (and (<= n 9) (zerop (% n 3))) ; visual aids to help with 1-9 keys
  		    (put-text-property (match-beginning 0)
  				       (1+ (match-beginning 0))
! 				       'font-lock-face 'info-menu-5)))
  	      (when not-fontified-p
  		(add-text-properties
  		 (match-beginning 1) (match-end 1)
--- 3878,3884 ----
  		(if (and (<= n 9) (zerop (% n 3))) ; visual aids to help with 1-9 keys
  		    (put-text-property (match-beginning 0)
  				       (1+ (match-beginning 0))
! 				       'font-lock-face 'info-menu-star)))
  	      (when not-fontified-p
  		(add-text-properties
  		 (match-beginning 1) (match-end 1)
***************
*** 3961,3967 ****
  \f
  ;;; Speedbar support:
  ;; These functions permit speedbar to display the "tags" in the
! ;; current info node.
  (eval-when-compile (require 'speedbar))
  
  (defvar Info-speedbar-key-map nil
--- 3972,3978 ----
  \f
  ;;; Speedbar support:
  ;; These functions permit speedbar to display the "tags" in the
! ;; current Info node.
  (eval-when-compile (require 'speedbar))
  
  (defvar Info-speedbar-key-map nil
***************
*** 4003,4009 ****
  ;;; Info hierarchy display method
  ;;;###autoload
  (defun Info-speedbar-browser ()
!   "Initialize speedbar to display an info node browser.
  This will add a speedbar major display mode."
    (interactive)
    (require 'speedbar)
--- 4014,4020 ----
  ;;; Info hierarchy display method
  ;;;###autoload
  (defun Info-speedbar-browser ()
!   "Initialize speedbar to display an Info node browser.
  This will add a speedbar major display mode."
    (interactive)
    (require 'speedbar)
***************
*** 4144,4150 ****
  		"^No `.*' in index$"
  		"^No cross-reference named"
  		"^No cross.references in this node$"
! 		"^No current info node$"
  		"^No menu in this node$"
  		"^No more items in menu$"
  		"^No more nodes$"
--- 4155,4161 ----
  		"^No `.*' in index$"
  		"^No cross-reference named"
  		"^No cross.references in this node$"
! 		"^No current Info node$"
  		"^No menu in this node$"
  		"^No more items in menu$"
  		"^No more nodes$"
***************
*** 4171,4177 ****
  (defun Info-restore-desktop-buffer (desktop-buffer-file-name
                                      desktop-buffer-name
                                      desktop-buffer-misc)
!   "Restore an info buffer specified in a desktop file."
    (let ((first (nth 0 desktop-buffer-misc))
          (second (nth 1 desktop-buffer-misc)))
    (when (and first second)
--- 4182,4188 ----
  (defun Info-restore-desktop-buffer (desktop-buffer-file-name
                                      desktop-buffer-name
                                      desktop-buffer-misc)
!   "Restore an Info buffer specified in a desktop file."
    (let ((first (nth 0 desktop-buffer-misc))
          (second (nth 1 desktop-buffer-misc)))
    (when (and first second)

-- 
Juri Linkov
http://www.jurta.org/emacs/

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2005-08-04  0:29 info.el Juri Linkov
@ 2005-08-04 20:46 ` Richard M. Stallman
  2005-08-05  0:05   ` info.el Juri Linkov
  0 siblings, 1 reply; 21+ messages in thread
From: Richard M. Stallman @ 2005-08-04 20:46 UTC (permalink / raw)
  Cc: emacs-devel

    5. Fixed `info-apropos' to work exactly as `index-apropos' in the
       stand-alone Info reader.

Could you say more specifically what the change is?

    7. Removed `S' binding (`Info-search-case-sensitively') since it is not
       useful anymore with isearch working on the whole Info manual.

Could you explain the reasoning behind that?

The other changes seem clearly good.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2005-08-04 20:46 ` info.el Richard M. Stallman
@ 2005-08-05  0:05   ` Juri Linkov
  2005-08-05  4:31     ` info.el Luc Teirlinck
                       ` (2 more replies)
  0 siblings, 3 replies; 21+ messages in thread
From: Juri Linkov @ 2005-08-05  0:05 UTC (permalink / raw)
  Cc: emacs-devel

>     5. Fixed `info-apropos' to work exactly as `index-apropos' in the
>        stand-alone Info reader.
>
> Could you say more specifically what the change is?

The change is in the sorting order (it was in reverse order before
this change) and minor formatting details.

>     7. Removed `S' binding (`Info-search-case-sensitively') since it is not
>        useful anymore with isearch working on the whole Info manual.
>
> Could you explain the reasoning behind that?

isearch has the command to toggle the case sensitivity - `M-c',
and it is possible to use it to search the whole Info manual.

But since `S' binding doesn't hurt, let's leave it alone, and remove
only its menu item from the Info menu.  Currently this menu is too big
already, and it would be good to retain only basic commands in it.

-- 
Juri Linkov
http://www.jurta.org/emacs/

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2005-08-05  0:05   ` info.el Juri Linkov
@ 2005-08-05  4:31     ` Luc Teirlinck
  2005-08-05  5:02       ` info.el Juri Linkov
  2005-08-05  4:45     ` info.el Luc Teirlinck
  2005-08-05 20:37     ` info.el Richard M. Stallman
  2 siblings, 1 reply; 21+ messages in thread
From: Luc Teirlinck @ 2005-08-05  4:31 UTC (permalink / raw)
  Cc: rms, emacs-devel

Juri Linkov wrote:

   isearch has the command to toggle the case sensitivity - `M-c',
   and it is possible to use it to search the whole Info manual.

   But since `S' binding doesn't hurt, let's leave it alone, and remove
   only its menu item from the Info menu.  Currently this menu is too big
   already, and it would be good to retain only basic commands in it.

Please leave the S binding as it is _and_ leave it in the C-h m menu.
The S command is by no means unimportant if Info-isearch-search is nil.
The C-h m menu is _not_ too big.  The C-h m menu needs to be complete,
or else you can not rely on it.  You do not need to learn that entire
menu by heart.  You browse through it and remember those bindings
that seem most important to you.  And yes, S is important to me.  It
is listed under "Advanced commands", indicating already that it might
not be important to all users.

Sincerely,

Luc.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2005-08-05  0:05   ` info.el Juri Linkov
  2005-08-05  4:31     ` info.el Luc Teirlinck
@ 2005-08-05  4:45     ` Luc Teirlinck
  2005-08-05 20:37     ` info.el Richard M. Stallman
  2 siblings, 0 replies; 21+ messages in thread
From: Luc Teirlinck @ 2005-08-05  4:45 UTC (permalink / raw)
  Cc: rms, emacs-devel

Juri Linkov wrote:

   But since `S' binding doesn't hurt, let's leave it alone, and remove
   only its menu item from the Info menu.  Currently this menu is too big
   already, and it would be good to retain only basic commands in it.

Sorry, I may have misunderstood you.  I thought that you were
referring to the `C-h m' output and my response was based on that.  On
more careful reading, I get the impression that you were referring to
the menu bar menu instead.  In that case, I do not mind.

Sincerely,

Luc.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2005-08-05  4:31     ` info.el Luc Teirlinck
@ 2005-08-05  5:02       ` Juri Linkov
  0 siblings, 0 replies; 21+ messages in thread
From: Juri Linkov @ 2005-08-05  5:02 UTC (permalink / raw)
  Cc: rms, emacs-devel

>    isearch has the command to toggle the case sensitivity - `M-c',
>    and it is possible to use it to search the whole Info manual.
>
>    But since `S' binding doesn't hurt, let's leave it alone, and remove
>    only its menu item from the Info menu.  Currently this menu is too big
>    already, and it would be good to retain only basic commands in it.
>
> Please leave the S binding as it is _and_ leave it in the C-h m menu.

OK.

> The C-h m menu is _not_ too big.  The C-h m menu needs to be complete,
> or else you can not rely on it.

I was talking about the menu bar, not the C-h m menu.

In the menu bar's Info menu the menu item "Search Case-Sensitively..."
is the widest menu item.  Removing it will make this menu more compact.

-- 
Juri Linkov
http://www.jurta.org/emacs/

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: info.el
  2005-08-05  0:05   ` info.el Juri Linkov
  2005-08-05  4:31     ` info.el Luc Teirlinck
  2005-08-05  4:45     ` info.el Luc Teirlinck
@ 2005-08-05 20:37     ` Richard M. Stallman
  2 siblings, 0 replies; 21+ messages in thread
From: Richard M. Stallman @ 2005-08-05 20:37 UTC (permalink / raw)
  Cc: emacs-devel

    The change is in the sorting order (it was in reverse order before
    this change) and minor formatting details.

Ok, I don't object to that.

    But since `S' binding doesn't hurt, let's leave it alone, and remove
    only its menu item from the Info menu.  Currently this menu is too big
    already, and it would be good to retain only basic commands in it.

I agree.  It is good to make the menu smaller, and this command is not
very important.

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2005-08-05 20:37 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-04-05  9:44 info.el Juri Linkov
2004-04-06  0:20 ` info.el Karl Berry
2004-04-06  4:05   ` info.el Juri Linkov
2004-04-06 12:51 ` info.el Jan Nieuwenhuizen
2004-04-06 13:17   ` info.el Karl Berry
2004-04-08  4:05     ` info.el Juri Linkov
2004-04-08 12:44       ` info.el Jan Nieuwenhuizen
2004-04-08 15:40         ` info.el Stefan Monnier
2004-04-08 15:57           ` info.el Jan Nieuwenhuizen
2004-04-08 17:21             ` info.el Stefan Monnier
2004-04-08 16:01       ` info.el Karl Berry
  -- strict thread matches above, loose matches on Subject: below --
2004-04-11 17:20 info.el Luc Teirlinck
2004-04-11 17:26 ` info.el Luc Teirlinck
2004-04-12  5:06 ` info.el Juri Linkov
2005-08-04  0:29 info.el Juri Linkov
2005-08-04 20:46 ` info.el Richard M. Stallman
2005-08-05  0:05   ` info.el Juri Linkov
2005-08-05  4:31     ` info.el Luc Teirlinck
2005-08-05  5:02       ` info.el Juri Linkov
2005-08-05  4:45     ` info.el Luc Teirlinck
2005-08-05 20:37     ` info.el Richard M. Stallman

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).