X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/55fb4ff7a72385327061e1b90f70d4c4236e9730..05d3aeb016e4026ab0b72fbac54e1aebd00cbb0e:/lisp/man.el diff --git a/lisp/man.el b/lisp/man.el index 70304d3204..77c089b9d8 100644 --- a/lisp/man.el +++ b/lisp/man.el @@ -1,7 +1,7 @@ ;;; 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 ;; Maintainer: FSF @@ -262,7 +262,7 @@ the associated section number." (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 @@ -274,7 +274,7 @@ the associated section number." "(\\(" 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" @@ -286,9 +286,13 @@ This regexp should not start with a `^' character.") 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.") @@ -300,7 +304,7 @@ 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 "[/~$]" @@ -412,13 +416,28 @@ Otherwise, the value is whatever the function (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) @@ -445,7 +464,7 @@ Otherwise, the value is whatever the function ;; 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. @@ -553,8 +572,8 @@ This is necessary if one wants to dump man.el with Emacs." (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)) @@ -592,7 +611,7 @@ This option allows `man' to interpret command line arguments 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 @@ -663,10 +682,10 @@ all sections related to a subject, put something appropriate into the (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") @@ -903,36 +922,57 @@ Same for the ANSI bold and normal escape sequences." '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 ) 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 ), 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. @@ -1273,7 +1313,7 @@ Returns t if section is found, nil otherwise." (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 "")) @@ -1328,7 +1368,7 @@ Specify which REFERENCE to use; default is based on word at point." 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 "")) @@ -1350,7 +1390,7 @@ Specify which REFERENCE to use; default is based on word at point." (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)