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