:type 'face
:group 'man)
-(defcustom Man-reverse-face 'secondary-selection
+(defcustom Man-reverse-face 'highlight
"*Face to use when fontifying reverse video."
:type 'face
:group 'man)
(defvar Man-cooked-hook nil
"Hook run after removing backspaces but before `Man-mode' processing.")
-(defvar Man-name-regexp "[-a-zA-Z0-9_+][-a-zA-Z0-9_.+]*"
+(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]"
(let ((table (copy-syntax-table (standard-syntax-table))))
(modify-syntax-entry ?. "w" table)
(modify-syntax-entry ?_ "w" table)
+ (modify-syntax-entry ?: "w" table) ; for PDL::Primitive in Perl man pages
table)
"Syntax table used in Man mode buffers.")
-(if Man-mode-map
- nil
- (setq Man-mode-map (copy-keymap button-buffer-map))
+(unless Man-mode-map
+ (setq Man-mode-map (make-sparse-keymap))
(suppress-keymap Man-mode-map)
+ (set-keymap-parent Man-mode-map button-buffer-map)
+
(define-key Man-mode-map " " 'scroll-up)
(define-key Man-mode-map "\177" 'scroll-down)
(define-key Man-mode-map "n" 'Man-next-section)
(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 "?" 'describe-mode)
- )
+ (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")
+ 'follow-link t
+ 'help-echo "mouse-2, RET: display this man page")
(define-button-type 'Man-xref-header-file
'action (lambda (button)
(let ((w (button-get button 'Man-target-string)))
(unless (Man-view-header-file w)
(error "Cannot find header file: %s" w))))
+ 'follow-link t
'help-echo "mouse-2: display this header file")
(define-button-type 'Man-xref-normal-file
(view-file f)
(error "Cannot read a file: %s" f))
(error "Cannot find a file: %s" f))))
+ 'follow-link t
'help-echo "mouse-2: display this file")
\f
(setq buffer (generate-new-buffer bufname))
(save-excursion
(set-buffer buffer)
+ (setq buffer-undo-list t)
(setq Man-original-frame (selected-frame))
(setq Man-arguments man-args))
(let ((process-environment (copy-sequence process-environment))
(goto-char (point-min))
;; Fontify ANSI escapes.
(let ((faces nil)
+ (buffer-undo-list t)
(start (point)))
;; http://www.isthe.com/chongo/tech/comp/ansi_escapes.html
;; suggests many codes, but we only handle:
(delete-region (match-beginning 0) (match-end 0))
(setq start (point))))
;; Other highlighting.
- (if (< (buffer-size) (position-bytes (point-max)))
- ;; Multibyte characters exist.
- (progn
- (goto-char (point-min))
- (while (search-forward "__\b\b" nil t)
- (backward-delete-char 4)
- (put-text-property (point) (1+ (point)) 'face Man-underline-face))
- (goto-char (point-min))
- (while (search-forward "\b\b__" nil t)
- (backward-delete-char 4)
- (put-text-property (1- (point)) (point) 'face Man-underline-face))))
- (goto-char (point-min))
- (while (search-forward "_\b" nil t)
- (backward-delete-char 2)
- (put-text-property (point) (1+ (point)) 'face Man-underline-face))
- (goto-char (point-min))
- (while (search-forward "\b_" nil t)
- (backward-delete-char 2)
- (put-text-property (1- (point)) (point) 'face Man-underline-face))
- (goto-char (point-min))
- (while (re-search-forward "\\(.\\)\\(\b+\\1\\)+" nil t)
- (replace-match "\\1")
- (put-text-property (1- (point)) (point) 'face Man-overstrike-face))
- (goto-char (point-min))
- (while (re-search-forward "o\b\\+\\|\\+\bo" nil t)
- (replace-match "o")
- (put-text-property (1- (point)) (point) 'face 'bold))
- (goto-char (point-min))
- (while (re-search-forward "[-|]\\(\b[-|]\\)+" nil t)
- (replace-match "+")
- (put-text-property (1- (point)) (point) 'face 'bold))
- (goto-char (point-min))
- ;; Try to recognize common forms of cross references.
- (Man-highlight-references)
- (Man-softhyphen-to-minus)
- (goto-char (point-min))
- (while (re-search-forward Man-heading-regexp nil t)
- (put-text-property (match-beginning 0)
- (match-end 0)
- 'face Man-overstrike-face))
+ (let ((buffer-undo-list t))
+ (if (< (buffer-size) (position-bytes (point-max)))
+ ;; Multibyte characters exist.
+ (progn
+ (goto-char (point-min))
+ (while (search-forward "__\b\b" nil t)
+ (backward-delete-char 4)
+ (put-text-property (point) (1+ (point)) 'face Man-underline-face))
+ (goto-char (point-min))
+ (while (search-forward "\b\b__" nil t)
+ (backward-delete-char 4)
+ (put-text-property (1- (point)) (point) 'face Man-underline-face))))
+ (goto-char (point-min))
+ (while (search-forward "_\b" nil t)
+ (backward-delete-char 2)
+ (put-text-property (point) (1+ (point)) 'face Man-underline-face))
+ (goto-char (point-min))
+ (while (search-forward "\b_" nil t)
+ (backward-delete-char 2)
+ (put-text-property (1- (point)) (point) 'face Man-underline-face))
+ (goto-char (point-min))
+ (while (re-search-forward "\\(.\\)\\(\b+\\1\\)+" nil t)
+ (replace-match "\\1")
+ (put-text-property (1- (point)) (point) 'face Man-overstrike-face))
+ (goto-char (point-min))
+ (while (re-search-forward "o\b\\+\\|\\+\bo" nil t)
+ (replace-match "o")
+ (put-text-property (1- (point)) (point) 'face 'bold))
+ (goto-char (point-min))
+ (while (re-search-forward "[-|]\\(\b[-|]\\)+" nil t)
+ (replace-match "+")
+ (put-text-property (1- (point)) (point) 'face 'bold))
+ (goto-char (point-min))
+ ;; Try to recognize common forms of cross references.
+ (Man-highlight-references)
+ (Man-softhyphen-to-minus)
+ (goto-char (point-min))
+ (while (re-search-forward Man-heading-regexp nil t)
+ (put-text-property (match-beginning 0)
+ (match-end 0)
+ 'face Man-overstrike-face)))
(message "%s man page formatted" Man-arguments))
(defun Man-highlight-references ()
;; ======================================================================
;; set up manual mode in buffer and build alists
+(put 'Man-mode 'mode-class 'special)
+
(defun Man-mode ()
"A mode for browsing Un*x manual pages.
The following key bindings are currently in effect in the buffer:
\\{Man-mode-map}"
(interactive)
+ (kill-all-local-variables)
(setq major-mode 'Man-mode
mode-name "Man"
buffer-auto-save-file-name nil
" {" 'Man-page-mode-string "}")
truncate-lines t
buffer-read-only t)
- (buffer-disable-undo (current-buffer))
+ (buffer-disable-undo)
(auto-fill-mode -1)
(use-local-map Man-mode-map)
(set-syntax-table man-mode-syntax-table)
(Man-strip-page-headers)
(Man-unindent)
(Man-goto-page 1)
- (run-hooks 'Man-mode-hook))
+ (run-mode-hooks 'Man-mode-hook))
(defsubst Man-build-section-alist ()
"Build the association list of manpage sections."
(error "There are no references in the current man page")
(list (let* ((default (or
(car (all-completions
- (let ((word (Man-possibly-hyphenated-word)))
+ (let ((word
+ (or (Man-possibly-hyphenated-word)
+ "")))
;; strip a trailing '-':
(if (string-match "-$" word)
(substring word 0