Function: mailcap-view-file
mailcap-view-file is an interactive and byte-compiled function defined
in mailcap.el.gz.
Signature
(mailcap-view-file FILE)
Documentation
View FILE according to rules given by the mailcap system.
This normally involves executing some external program to display the file.
See "~/.mailcap", mailcap-mime-data and related files and variables.
Probably introduced at or before Emacs version 28.1.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/net/mailcap.el.gz
(defun mailcap-view-file (file)
"View FILE according to rules given by the mailcap system.
This normally involves executing some external program to display
the file.
See \"~/.mailcap\", `mailcap-mime-data' and related files and variables."
(interactive "fOpen file with mailcap: ")
(setq file (expand-file-name file))
(mailcap-parse-mailcaps)
(let ((command (mailcap-mime-info
(mailcap-extension-to-mime (file-name-extension file)))))
(if (functionp command)
;; command is a viewer function (a mode) expecting the file
;; contents to be in the current buffer.
(let ((buf (generate-new-buffer (file-name-nondirectory file))))
(set-buffer buf)
(insert-file-contents file)
(setq buffer-file-name file)
(funcall command)
(set-buffer-modified-p nil)
(pop-to-buffer buf))
;; command is a program to run with file as an argument.
(unless command
(error "No viewer for %s" (file-name-extension file)))
;; Remove quotes around the file name - we'll use shell-quote-argument.
(while (string-match "['\"]%s['\"]" command)
(setq command (replace-match "%s" t t command)))
(setq command (replace-regexp-in-string
"%s"
(shell-quote-argument (convert-standard-filename file))
command
nil t))
;; Handlers such as "gio open" and kde-open5 start viewer in background
;; and exit immediately. Avoid `start-process' since it assumes
;; :connection-type `pty' and kills children processes with SIGHUP
;; when temporary terminal session is finished (Bug#44824).
;; An alternative is `process-connection-type' let-bound to nil for
;; `start-process-shell-command' call (with no chance to report failure).
(make-process
:name "mailcap-view-file"
:connection-type 'pipe
:buffer nil ; "*Messages*" may be suitable for debugging
:sentinel (lambda (proc event)
(when (and (memq (process-status proc) '(exit signal))
(/= (process-exit-status proc) 0))
(message
"Command %s: %s."
(mapconcat #'identity (process-command proc) " ")
(substring event 0 -1))))
:command (list shell-file-name shell-command-switch command)))))