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)))))
    (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))))