;;; man.el --- browse UNIX manual pages -*- coding: iso-8859-1 -*-
-;; Copyright (C) 1993, 1994, 1996, 1997, 2001, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1993, 1994, 1996, 1997, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Barry A. Warsaw <bwarsaw@cen.com>
;; Maintainer: FSF
(defvar Man-name-regexp "[-a-zA-Z0-9_+][-a-zA-Z0-9_.:+]*"
"Regular expression describing the name of a manpage (without section).")
-(defvar Man-section-regexp "[0-9][a-zA-Z+]*\\|[LNln]"
+(defvar Man-section-regexp "[0-9][a-zA-Z0-9+]*\\|[LNln]"
"Regular expression describing a manpage section within parentheses.")
(defvar Man-page-header-regexp
"(\\(" Man-section-regexp "\\))\\).*\\1"))
"Regular expression describing the heading of a page.")
-(defvar Man-heading-regexp "^\\([A-Z][A-Z -]+\\)$"
+(defvar Man-heading-regexp "^\\([A-Z][A-Z /-]+\\)$"
"Regular expression describing a manpage heading entry.")
(defvar Man-see-also-regexp "SEE ALSO"
This regular expression should start with a `^' character.")
(defvar Man-reference-regexp
- (concat "\\(" Man-name-regexp "\\)(\\(" Man-section-regexp "\\))")
+ (concat "\\(" Man-name-regexp "\\)[ \t]*(\\(" Man-section-regexp "\\))")
"Regular expression describing a reference to another manpage.")
+(defvar Man-apropos-regexp
+ (concat "\\\[\\(" Man-name-regexp "\\)\\\][ \t]*(\\(" Man-section-regexp "\\))")
+ "Regular expression describing a reference to manpages in \"man -k output\".")
+
(defvar Man-synopsis-regexp "SYNOPSIS"
"Regular expression for SYNOPSIS 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]+"
+(defvar Man-file-name-regexp "[^<>\", \t\n]+"
"Regular expression describing <> in #include line (directive of cpp).")
(defvar Man-normal-file-prefix-regexp "[/~$]"
(define-key Man-mode-map "k" 'Man-kill)
(define-key Man-mode-map "q" 'Man-quit)
(define-key Man-mode-map "m" 'man)
+ ;; Not all the man references get buttons currently. The text in the
+ ;; manual page can contain references to other man pages
+ (define-key Man-mode-map "\r" 'man-follow)
(define-key Man-mode-map "?" 'describe-mode))
;; buttons
-(define-button-type 'Man-xref-man-page
- 'action (lambda (button) (man-follow (button-label button)))
+(define-button-type 'Man-abstract-xref-man-page
'follow-link t
- 'help-echo "mouse-2, RET: display this man page")
+ 'help-echo "mouse-2, RET: display this man page"
+ 'func nil
+ 'action (lambda (button)
+ (funcall
+ (button-get button 'func)
+ (let ((func (button-get button 'Man-target-string)))
+ (if func
+ (if (functionp func) (funcall func) func)
+ (button-label button))))))
+
+(define-button-type 'Man-xref-man-page
+ :supertype 'Man-abstract-xref-man-page
+ 'func 'man-follow)
+
(define-button-type 'Man-xref-header-file
'action (lambda (button)
;; utilities
(defun Man-init-defvars ()
- "Used for initialising variables based on display's color support.
+ "Used for initializing variables based on display's color support.
This is necessary if one wants to dump man.el with Emacs."
;; Avoid possible error in call-process by using a directory that must exist.
(defun Man-translate-references (ref)
"Translates REF from \"chmod(2V)\" to \"2v chmod\" style.
Leave it as is if already in that style. Possibly downcase and
-translate the section (see the Man-downcase-section-letters-flag
-and the Man-section-translations-alist variables)."
+translate the section (see the `Man-downcase-section-letters-flag'
+and the `Man-section-translations-alist' variables)."
(let ((name "")
(section "")
(slist Man-section-translations-alist))
as local filenames.
Return the value of the variable `Man-support-local-filenames'
if it was set to nil or t before the call of this function.
-If t, the man command supports `-l' option. If nil, it don't.
+If t, the man command supports `-l' option. If nil, it doesn't.
Otherwise, if the value of `Man-support-local-filenames'
is neither t nor nil, then determine a new value, set it
to the variable `Man-support-local-filenames' and return
(interactive
(list (let* ((default-entry (Man-default-man-entry))
(input (read-string
- (format "Manual entry%s: "
+ (format "Manual entry%s"
(if (string= default-entry "")
- ""
- (format " (default %s)" default-entry)))
+ ": "
+ (format " (default %s): " default-entry)))
nil nil default-entry)))
(if (string= input "")
(error "No man args given")
'face Man-overstrike-face)))
(message "%s man page formatted" Man-arguments))
-(defun Man-highlight-references ()
+(defun Man-highlight-references (&optional xref-man-type)
"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)
+References include items in the SEE ALSO section,
+header file (#include <foo.h>), and files in FILES.
+If optional argument XREF-MAN-TYPE is non-nil, it used as the
+button type for items in SEE ALSO section. If it is nil, the
+default type, `Man-xref-man-page' is used for the buttons."
+ ;; `Man-highlight-references' is used from woman.el, too.
+ ;; woman.el doesn't set `Man-arguments'.
+ (unless Man-arguments
+ (setq Man-arguments ""))
+ (if (string-match "-k " Man-arguments)
+ (progn
+ (Man-highlight-references0 nil Man-reference-regexp 1
+ 'Man-default-man-entry
+ (or xref-man-type 'Man-xref-man-page))
+ (Man-highlight-references0 nil Man-apropos-regexp 1
+ 'Man-default-man-entry
+ (or xref-man-type 'Man-xref-man-page)))
+ (Man-highlight-references0 Man-see-also-regexp Man-reference-regexp 1
+ 'Man-default-man-entry
+ (or xref-man-type '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 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)
+ (when (or (null start-section)
+ (Man-find-section start-section))
+ (let ((end (if start-section
+ (progn
+ (forward-line 1)
+ (back-to-indentation)
+ (save-excursion
+ (Man-next-section 1)
+ (point)))
+ (goto-char (point-min))
+ (point-max))))
(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)
- )))))
+ 'Man-target-string (cond
+ ((numberp target)
+ (match-string target))
+ ((functionp target)
+ target)
+ (t nil)))))))
(defun Man-cleanup-manpage (&optional interactive)
"Remove overstriking and underlining from the current buffer.
(let* ((default (aheadsym Man-sections-alist))
(completion-ignore-case t)
chosen
- (prompt (concat "Go to section: (default " default ") ")))
+ (prompt (concat "Go to section (default " default "): ")))
(setq chosen (completing-read prompt Man-sections-alist))
(if (or (not chosen)
(string= chosen ""))
Man-refpages-alist))
(aheadsym Man-refpages-alist)))
chosen
- (prompt (concat "Refer to: (default " default ") ")))
+ (prompt (concat "Refer to (default " default "): ")))
(setq chosen (completing-read prompt Man-refpages-alist))
(if (or (not chosen)
(string= chosen ""))
(interactive)
(quit-window))
-(defun Man-goto-page (page noerror)
+(defun Man-goto-page (page &optional noerror)
"Go to the manual page on page PAGE."
(interactive
(if (not Man-page-list)