]> git.eshelyaron.com Git - emacs.git/commitdiff
(Info-fontify-node):
authorMiles Bader <miles@gnu.org>
Sun, 17 Sep 2000 16:21:42 +0000 (16:21 +0000)
committerMiles Bader <miles@gnu.org>
Sun, 17 Sep 2000 16:21:42 +0000 (16:21 +0000)
  Make a few cleanups.
  Add extra `help-echo' and `local-map' props to node xrefs.
  Use header-specific faces for node-names & xrefs.
(Info-use-header-line, Info-header-line):
  New variables.
(info-header, info-header-xref, info-header-node):
  New faces.
(Info-setup-header-line):
  New function.
(Info-select-node):
  Call Info-setup-header-line when enabled.
(Info-extract-pointer):
  Work even if the header line is hidden.

lisp/ChangeLog
lisp/info.el

index d3ca3d3f00a16aa2f7df7724fa32531abc92519b..f8f1059b30e81f5edb98a2a57430006200b7a244 100644 (file)
@@ -1,3 +1,15 @@
+2000-09-18  Miles Bader  <miles@gnu.org>
+
+       * info.el (Info-fontify-node): Make a few cleanups.
+       Add extra `help-echo' and `local-map' props to node xrefs.
+       Use header-specific faces for node-names & xrefs.
+       (Info-use-header-line): New variable.
+       (info-header, info-header-xref, info-header-node): New faces.
+       (Info-setup-header-line): New function.
+       (Info-select-node): Call Info-setup-header-line when enabled.
+       (Info-extract-pointer): Work even if the header line is hidden.
+       (Info-header-line): New variable.
+
 2000-09-16  Stefan Monnier  <monnier@cs.yale.edu>
 
        * vms-patch.el (print-region-function): Don't quote lambda.
index cd9f86384bb50263aaac367875e91da65a1c8a4d..dd1a5490e299a0d413a6ad7f283ced4e25112da2 100644 (file)
@@ -83,6 +83,22 @@ The Lisp code is executed when the node is selected.")
   :type 'integer
   :group 'info)
 
+(defcustom Info-use-header-line t
+  "*Non-nil means to put the beginning-of-node links in an emacs header-line.
+A header-line does not scroll with the rest of the buffer."
+  :type 'boolean
+  :group 'info)
+
+(defface info-header-xref
+  '((t (:weight bold)))
+  "Face for Info cross-references in a node header."
+  :group 'info)
+
+(defface info-header-node
+  '((t (:weight bold :slant italic)))
+  "Face for Info nodes in a node header."
+  :group 'info)
+
 (defvar Info-directory-list nil
   "List of directories to search for Info documentation files.
 nil means not yet initialized.  In this case, Info uses the environment
@@ -873,6 +889,9 @@ a case-insensitive match is tried."
     (if (numberp nodepos)
        (+ (- nodepos lastfilepos) (point)))))
 
+(defvar Info-header-line nil
+  "If the info node header is hidden, the text of the header.")
+
 (defun Info-select-node ()
 "Select the info node that point is in.
 Bind this in case the user sets it to nil."
@@ -895,6 +914,7 @@ Bind this in case the user sets it to nil."
       ;; Find the end of it, and narrow.
       (beginning-of-line)
       (let (active-expression)
+       ;; Narrow to the node contents
        (narrow-to-region (point)
                          (if (re-search-forward "\n[\^_\f]" nil t)
                              (prog1
@@ -907,6 +927,9 @@ Bind this in case the user sets it to nil."
                            (point-max)))
        (if Info-enable-active-nodes (eval active-expression))
        (if Info-fontify (Info-fontify-node))
+       (if Info-use-header-line
+           (Info-setup-header-line)
+         (setq Info-header-line nil))
        (run-hooks 'Info-selection-hook)))))
 
 (defun Info-set-mode-line ()
@@ -919,6 +942,16 @@ Bind this in case the user sets it to nil."
         ") "
         (or Info-current-node ""))))
 \f
+;; Skip the node header and make it into a header-line.  This function
+;; should be called when the node is already narrowed.
+(defun Info-setup-header-line ()
+  (goto-char (point-min))
+  (forward-line 1)
+  (set (make-local-variable 'Info-header-line)
+       (buffer-substring (point-min) (1- (point))))
+  (setq header-line-format 'Info-header-line)
+  (narrow-to-region (point) (point-max)))
+\f
 ;; Go to an info node specified with a filename-and-nodename string
 ;; of the sort that is found in pointers in nodes.
 
@@ -1101,15 +1134,20 @@ if ERRORNAME is nil, just return nil.
 Bind this in case the user sets it to nil."
   (let ((case-fold-search t))
     (save-excursion
-      (goto-char (point-min))
-      (forward-line 1)
-      (if (re-search-backward (concat name ":") nil t)
-         (progn
+      (save-restriction
+       (goto-char (point-min))
+       (when Info-header-line
+         ;; expose the header line in the buffer
+         (widen)
+         (forward-line -1))
+       (let ((bound (point)))
+         (forward-line 1)
+         (cond ((re-search-backward (concat name ":") nil bound)
            (goto-char (match-end 0))
            (Info-following-node-name))
-       (if (eq errorname t)
-           nil
-         (error "Node has no %s" (capitalize (or errorname name))))))))
+               ((not (eq errorname t))
+                (error "Node has no %s"
+                       (capitalize (or errorname name))))))))))
 
 (defun Info-following-node-name (&optional allowedchars)
   "Return the node name in the buffer following point.
@@ -2321,18 +2359,29 @@ the variable `Info-file-list-for-emacs'."
       (goto-char (point-min))
       (when (looking-at "^File: [^,: \t]+,?[ \t]+")
        (goto-char (match-end 0))
-       (while
-           (looking-at "[ \t]*\\([^:, \t\n]+\\):[ \t]+\\([^:,\t\n]+\\),?")
+       (while (looking-at "[ \t]*\\([^:, \t\n]+\\):[ \t]+\\([^:,\t\n]+\\),?")
          (goto-char (match-end 0))
-         (if (save-excursion
-               (goto-char (match-beginning 1))
-               (save-match-data (looking-at "Node:")))
-             (put-text-property (match-beginning 2) (match-end 2)
-                                'face 'info-node)
-           (put-text-property (match-beginning 2) (match-end 2)
-                              'face 'info-xref)
-           (put-text-property (match-beginning 2) (match-end 2)
-                              'mouse-face 'highlight))))
+         (let* ((nbeg (match-beginning 2))
+                (nend (match-end 2))
+                (tbeg (match-beginning 1))
+                (tag (buffer-substring tbeg (match-end 1))))
+           (if (string-equal tag "Node")
+               (put-text-property nbeg nend 'face 'info-header-node)
+             (put-text-property nbeg nend 'face 'info-header-xref)
+             (put-text-property nbeg nend 'mouse-face 'highlight)
+             (put-text-property tbeg nend
+                                'help-echo
+                                (concat "Goto node "
+                                        (buffer-substring nbeg nend)))
+             (let ((fun (cdr (assoc tag '(("Prev" . Info-prev)
+                                          ("Next" . Info-next)
+                                          ("Up" . Info-up))))))
+               (when fun
+                 (let ((keymap (make-sparse-keymap)))
+                   (define-key keymap [header-line mouse-1] fun)
+                   (define-key keymap [header-line mouse-2] fun)
+                   (put-text-property tbeg nend 'local-map keymap))))
+             ))))
       (goto-char (point-min))
       (while (re-search-forward "\n\\([^ \t\n].+\\)\n\\(\\*+\\|=+\\|-+\\)$"
                                nil t)