1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-23 07:19:15 +00:00

(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.
This commit is contained in:
Juanma Barranquero 2003-04-02 21:22:38 +00:00
parent dfc42f38c1
commit 4edd9faf12

View File

@ -95,6 +95,7 @@
;;; Code:
(require 'assoc)
(require 'button)
;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
;; empty defvars (keep the compiler quiet)
@ -210,6 +211,12 @@ the associated section number."
(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 @@ This regular expression should start with a `^' character.")
(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 @@ make -a one of the switches, if your `man' program supports it.")
(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 @@ make -a one of the switches, if your `man' program supports it.")
(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 @@ all sections related to a subject, put something appropriate into the
(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 @@ Same for the ANSI bold and normal escape sequences."
(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 <foo.h>) 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 @@ Specify which REFERENCE to use; default is based on word at point."
(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)