# HG changeset patch # User Juanma Barranquero # Date 1049318558 0 # Node ID 7dc2f9f7086b234aade5b0901b966890b65330c1 # Parent f6e3a528d815e3111a28375912ff475725a264a4 (toplevel): Require button. (Man-header-file-path): New option. (Man-synopsis-regexp, Man-files-regexp, Man-include-regexp) (Man-file-name-regexp, Man-normal-file-prefix-regexp, Man-header-regexp) (Man-normal-file-regexp): New variables. (Man-mode-map): Inherited from `button-buffer-map'. Don't define "\r" and mouse-2 directly. These key are defined in `button-buffer-map'. (Man-xref-man-page, Man-xref-header-file, Man-xref-normal-file): New buttons. `Man-xref-man-page' comes from woman.el. (man-follow-mouse): Removed. (Man-fontify-manpage): Use `Man-highlight-references' instead of calling `add-text-properties' directly. (Man-highlight-references, Man-highlight-references0): New functions. (Man-view-header-file): New function. diff -r f6e3a528d815 -r 7dc2f9f7086b lisp/man.el --- a/lisp/man.el Wed Apr 02 16:48:11 2003 +0000 +++ b/lisp/man.el Wed Apr 02 21:22:38 2003 +0000 @@ -95,6 +95,7 @@ ;;; Code: (require 'assoc) +(require 'button) ;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ;; empty defvars (keep the compiler quiet) @@ -210,6 +211,12 @@ (string :tag "Real Section"))) :group 'man) +(defcustom Man-header-file-path + '("/usr/include" "/usr/local/include") + "C Header file search path used in Man." + :type '(repeat string) + :group 'man) + (defvar manual-program "man" "The name of the program that produces man pages.") @@ -264,6 +271,34 @@ (concat "\\(" Man-name-regexp "\\)(\\(" Man-section-regexp "\\))") "Regular expression describing a reference to another manpage.") +(defvar Man-synopsis-regexp "SYNOPSIS" + "Regular expression for SYNOPSIS heading (or your equivalent). +This regexp should not start with a `^' character.") + +(defvar Man-files-regexp "FILES" + "Regular expression for FILES heading (or your equivalent). +This regexp should not start with a `^' character.") + +(defvar Man-include-regexp "#[ \t]*include[ \t]*" + "Regular expression describing the #include (directive of cpp).") + +(defvar Man-file-name-regexp "[^<>\" \t\n]+" + "Regular expression describing <> in #include line (directive of cpp).") + +(defvar Man-normal-file-prefix-regexp "[/~$]" + "Regular expression describing a file path appeared in FILES section.") + +(defvar Man-header-regexp + (concat "\\(" Man-include-regexp "\\)" + "[<\"]" + "\\(" Man-file-name-regexp "\\)" + "[>\"]") + "Regular expression describing references to header files.") + +(defvar Man-normal-file-regexp + (concat Man-normal-file-prefix-regexp Man-file-name-regexp) + "Regular expression describing references to normal files.") + ;; This includes the section as an optional part to catch hyphenated ;; refernces to manpages. (defvar Man-hyphenated-reference-regexp @@ -333,7 +368,7 @@ (if Man-mode-map nil - (setq Man-mode-map (make-keymap)) + (setq Man-mode-map (copy-keymap button-buffer-map)) (suppress-keymap Man-mode-map) (define-key Man-mode-map " " 'scroll-up) (define-key Man-mode-map "\177" 'scroll-down) @@ -350,11 +385,31 @@ (define-key Man-mode-map "k" 'Man-kill) (define-key Man-mode-map "q" 'Man-quit) (define-key Man-mode-map "m" 'man) - (define-key Man-mode-map "\r" 'man-follow) - (define-key Man-mode-map [mouse-2] 'man-follow-mouse) (define-key Man-mode-map "?" 'describe-mode) ) +;; buttons +(define-button-type 'Man-xref-man-page + 'action (lambda (button) (man-follow (button-label button))) + 'help-echo "RET, mouse-2: display this man page") + +(define-button-type 'Man-xref-header-file + 'action (lambda (button) + (unless (Man-view-header-file (button-get button 'Man-target-string)) + (error "Cannot find header file: %s" w))) + 'help-echo "mouse-2: display this header file") + +(define-button-type 'Man-xref-normal-file + 'action (lambda (button) + (let ((f (substitute-in-file-name + (button-get button 'Man-target-string)))) + (if (file-exists-p f) + (if (file-readable-p f) + (view-file f) + (error "Cannot read a file: %s" f)) + (error "Cannot find a file: %s" f)))) + 'help-echo "mouse-2: mouse-2: display this file") + ;; ====================================================================== ;; utilities @@ -562,13 +617,6 @@ (error "No item under point") (man man-args))) -(defun man-follow-mouse (e) - "Get a Un*x manual page of the item under the mouse and put it in a buffer." - (interactive "e") - (save-excursion - (mouse-set-point e) - (call-interactively 'man-follow))) - (defun Man-getpage-in-background (topic) "Use TOPIC to build and fire off the manpage and cleaning command." (let* ((man-args topic) @@ -737,12 +785,41 @@ (put-text-property (1- (point)) (point) 'face 'bold)) (goto-char (point-min)) ;; Try to recognize common forms of cross references. - (while (re-search-forward "\\w+([0-9].?)" nil t) - (put-text-property (match-beginning 0) (match-end 0) - 'mouse-face 'highlight)) + (Man-highlight-references) (Man-softhyphen-to-minus) (message "%s man page made up" Man-arguments)) +(defun Man-highlight-references () + "Highlight the references on mouse-over. +references include items in the SEE ALSO section, +header file(#include ) and files in FILES" + (let ((dummy 0)) + (Man-highlight-references0 + Man-see-also-regexp Man-reference-regexp 1 dummy + 'Man-xref-man-page) + (Man-highlight-references0 + Man-synopsis-regexp Man-header-regexp 0 2 + 'Man-xref-header-file) + (Man-highlight-references0 + Man-files-regexp Man-normal-file-regexp 0 0 + 'Man-xref-normal-file))) + +(defun Man-highlight-references0 (start-section regexp button-pos target-pos type) + ;; Based on `Man-build-references-alist' + (when (Man-find-section start-section) + (forward-line 1) + (let ((end (save-excursion + (Man-next-section 1) + (point)))) + (back-to-indentation) + (while (re-search-forward regexp end t) + (make-text-button + (match-beginning button-pos) + (match-end button-pos) + 'type type + 'Man-target-string (match-string target-pos) + ))))) + (defun Man-cleanup-manpage () "Remove overstriking and underlining from the current buffer." (interactive) @@ -1193,6 +1270,20 @@ (if Man-circular-pages-flag (Man-goto-page (length Man-page-list)) (error "You're looking at the first manpage in the buffer")))) + +;; Header file support +(defun Man-view-header-file (file) + "View a header file specified by FILE from `Man-header-file-path'." + (let ((path Man-header-file-path) + complete-path) + (while path + (setq complete-path (concat (car path) "/" file) + path (cdr path)) + (if (file-readable-p complete-path) + (progn (view-file complete-path) + (setq path nil)) + (setq complete-path nil))) + complete-path)) ;; Init the man package variables, if not already done. (Man-init-defvars)