From: Glenn Morris Date: Wed, 2 Mar 2011 08:31:47 +0000 (-0800) Subject: Add some dired-x support for local filenames with Red Hat's man. X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~674^2~80 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3ab7ebb9c598e33b1b90b3fe7adedf86c6ec8a48;p=emacs.git Add some dired-x support for local filenames with Red Hat's man. * lisp/man.el (Man-support-local-filenames): Also handle Red Hat's man. * lisp/dired-x.el (Man-support-local-filenames): Autoload it. (dired-guess-shell-alist-default): Also handle Red Hat's man. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 744b8dd5bac..6c91a30df54 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,9 @@ 2011-03-02 Glenn Morris + * man.el (Man-support-local-filenames): Also handle Red Hat's man. + * dired-x.el (Man-support-local-filenames): Autoload it. + (dired-guess-shell-alist-default): Also handle Red Hat's man. + * dired-x.el (dired-default-directory-alist, dired-default-directory): Mark as obsolete. (dired-smart-shell-command): Just call dired-current-directory. diff --git a/lisp/dired-x.el b/lisp/dired-x.el index a049bd00ccd..94398687d11 100644 --- a/lisp/dired-x.el +++ b/lisp/dired-x.el @@ -860,7 +860,7 @@ replace it with a dir-locals-file `./%s'" ;; NOTE: Use `gunzip -c' instead of `zcat' on `.gz' files. Some do not ;; install GNU zip's version of zcat. -(declare-function Man-support-local-filenames "man" ()) +(autoload 'Man-support-local-filenames "man") (defvar dired-guess-shell-alist-default (list @@ -953,20 +953,28 @@ replace it with a dir-locals-file `./%s'" " " dired-guess-shell-znew-switches)) ;; The following four extensions are useful with dired-man ("N" key) - (list "\\.\\(?:[0-9]\\|man\\)\\'" '(progn (require 'man) - (if (Man-support-local-filenames) - "man -l" - "cat * | tbl | nroff -man -h"))) - (list "\\.\\(?:[0-9]\\|man\\)\\.g?z\\'" '(progn (require 'man) - (if (Man-support-local-filenames) - "man -l" - "gunzip -qc * | tbl | nroff -man -h")) + ;; FIXME "man ./" does not work with dired-do-shell-command, + ;; because there seems to be no way for us to modify the filename, + ;; only the command. Hmph. `dired-man' works though. + ;; `dired-man' does + (list "\\.\\(?:[0-9]\\|man\\)\\'" '(let ((loc (Man-support-local-filenames))) + (cond ((eq loc 'man-db) "man -l") + ((eq loc 'man) "man ./") + (t + "cat * | tbl | nroff -man -h")))) + (list "\\.\\(?:[0-9]\\|man\\)\\.g?z\\'" + '(let ((loc (Man-support-local-filenames))) + (cond ((eq loc 'man-db) + "man -l") + ((eq loc 'man) + "man ./") + (t "gunzip -qc * | tbl | nroff -man -h"))) ;; Optional decompression. '(concat "gunzip" (if dired-guess-shell-gzip-quiet " -q"))) - (list "\\.[0-9]\\.Z\\'" '(progn (require 'man) - (if (Man-support-local-filenames) - "man -l" - "zcat * | tbl | nroff -man -h")) + (list "\\.[0-9]\\.Z\\'" '(let ((loc (Man-support-local-filenames))) + (cond ((eq loc 'man-db) "man -l") + ((eq loc 'man) "man ./") + (t "zcat * | tbl | nroff -man -h"))) ;; Optional conversion to gzip format. '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") " " dired-guess-shell-znew-switches)) diff --git a/lisp/man.el b/lisp/man.el index 0b3ac537c5b..c8c2f8653e2 100644 --- a/lisp/man.el +++ b/lisp/man.el @@ -623,36 +623,32 @@ and the `Man-section-translations-alist' variables)." (concat Man-specified-section-option section " " name)))) (defun Man-support-local-filenames () - "Check the availability of `-l' option of the man command. -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 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 -a new value." - (if (or (not Man-support-local-filenames) - (eq Man-support-local-filenames t)) - Man-support-local-filenames - (setq Man-support-local-filenames - (with-temp-buffer - (and (equal (condition-case nil - (let ((default-directory - ;; Assure that `default-directory' exists - ;; and is readable. - (if (and (file-directory-p default-directory) - (file-readable-p default-directory)) - default-directory - (expand-file-name "~/")))) - (call-process manual-program nil t nil "--help")) - (error nil)) - 0) - (progn - (goto-char (point-min)) - (search-forward "--local-file" nil t)) - t))))) + "Return non-nil if the man command supports local filenames. +Different man programs support this feature in different ways. +The default Debian man program (\"man-db\") has a `--local-file' +\(or `-l') option for this purpose. The default Red Hat man +program has no such option, but interprets any name containing +a \"/\" as a local filename. The function returns either `man-db' +`man', or nil." + (if (eq Man-support-local-filenames 'auto-detect) + (setq Man-support-local-filenames + (with-temp-buffer + (let ((default-directory + ;; Ensure that `default-directory' exists and is readable. + (if (and (file-directory-p default-directory) + (file-readable-p default-directory)) + default-directory + (expand-file-name "~/")))) + (ignore-errors + (call-process manual-program nil t nil "--help"))) + (cond ((search-backward "--local-file" nil 'move) + 'man-db) + ;; This feature seems to be present in at least ver 1.4f, + ;; which is about 20 years old. + ;; I don't know if this version has an official name? + ((looking-at "^man, versione? [1-9]") + 'man)))) + Man-support-local-filenames)) ;; ======================================================================