1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-26 10:49:33 +00:00
emacs/lisp/mail/metamail.el
Paul Eggert 875a5d0ead Prefer directed to neutral quotes
Prefer directed to neutral quotes in docstings and diagnostics.
In docstrings, escape apostrophes that would otherwise be translated
to curved quotes using the newer, simpler rules.
* admin/unidata/unidata-gen.el (unidata-gen-table):
* lisp/align.el (align-region):
* lisp/allout.el (allout-mode, allout-solicit-alternate-bullet):
* lisp/bookmark.el (bookmark-default-annotation-text):
* lisp/calc/calc-aent.el (math-read-if, math-read-factor):
* lisp/calc/calc-lang.el (math-read-giac-subscr)
(math-read-math-subscr):
* lisp/calc/calc-misc.el (report-calc-bug):
* lisp/calc/calc-prog.el (calc-fix-token-name)
(calc-read-parse-table-part):
* lisp/cedet/ede/pmake.el (ede-proj-makefile-insert-dist-rules):
* lisp/cedet/semantic/complete.el (semantic-displayor-show-request):
* lisp/dabbrev.el (dabbrev-expand):
* lisp/emacs-lisp/checkdoc.el (checkdoc-this-string-valid-engine):
* lisp/emacs-lisp/elint.el (elint-get-top-forms):
* lisp/emacs-lisp/lisp-mnt.el (lm-verify):
* lisp/emulation/viper-cmd.el (viper-toggle-search-style):
* lisp/erc/erc-button.el (erc-nick-popup):
* lisp/erc/erc.el (erc-cmd-LOAD, erc-handle-login):
* lisp/eshell/em-dirs.el (eshell/cd):
* lisp/eshell/em-glob.el (eshell-glob-regexp):
* lisp/eshell/em-pred.el (eshell-parse-modifiers):
* lisp/eshell/esh-arg.el (eshell-parse-arguments):
* lisp/eshell/esh-opt.el (eshell-show-usage):
* lisp/files-x.el (modify-file-local-variable):
* lisp/filesets.el (filesets-add-buffer, filesets-remove-buffer)
(filesets-update-pre010505):
* lisp/find-cmd.el (find-generic, find-to-string):
* lisp/gnus/auth-source.el (auth-source-netrc-parse-entries):
* lisp/gnus/gnus-agent.el (gnus-agent-check-overview-buffer)
(gnus-agent-fetch-headers):
* lisp/gnus/gnus-int.el (gnus-start-news-server):
* lisp/gnus/gnus-registry.el:
(gnus-registry--split-fancy-with-parent-internal):
* lisp/gnus/gnus-score.el (gnus-summary-increase-score):
* lisp/gnus/gnus-start.el (gnus-convert-old-newsrc):
* lisp/gnus/gnus-topic.el (gnus-topic-rename):
* lisp/gnus/legacy-gnus-agent.el (gnus-agent-unlist-expire-days):
* lisp/gnus/nnmairix.el (nnmairix-widget-create-query):
* lisp/gnus/spam.el (spam-check-blackholes):
* lisp/mail/feedmail.el (feedmail-run-the-queue):
* lisp/mpc.el (mpc-playlist-rename):
* lisp/net/ange-ftp.el (ange-ftp-shell-command):
* lisp/net/mairix.el (mairix-widget-create-query):
* lisp/net/tramp-cache.el:
* lisp/obsolete/otodo-mode.el (todo-more-important-p):
* lisp/obsolete/pgg-gpg.el (pgg-gpg-process-region):
* lisp/obsolete/pgg-pgp.el (pgg-pgp-process-region):
* lisp/obsolete/pgg-pgp5.el (pgg-pgp5-process-region):
* lisp/org/ob-core.el (org-babel-goto-named-src-block)
(org-babel-goto-named-result):
* lisp/org/ob-fortran.el (org-babel-fortran-ensure-main-wrap):
* lisp/org/ob-ref.el (org-babel-ref-resolve):
* lisp/org/org-agenda.el (org-agenda-prepare):
* lisp/org/org-bibtex.el (org-bibtex-fields):
* lisp/org/org-clock.el (org-clock-notify-once-if-expired)
(org-clock-resolve):
* lisp/org/org-feed.el (org-feed-parse-atom-entry):
* lisp/org/org-habit.el (org-habit-parse-todo):
* lisp/org/org-mouse.el (org-mouse-popup-global-menu)
(org-mouse-context-menu):
* lisp/org/org-table.el (org-table-edit-formulas):
* lisp/org/ox.el (org-export-async-start):
* lisp/play/dunnet.el (dun-score, dun-help, dun-endgame-question)
(dun-rooms, dun-endgame-questions):
* lisp/progmodes/ada-mode.el (ada-goto-matching-start):
* lisp/progmodes/ada-xref.el (ada-find-executable):
* lisp/progmodes/antlr-mode.el (antlr-options-alists):
* lisp/progmodes/flymake.el (flymake-parse-err-lines)
(flymake-start-syntax-check-process):
* lisp/progmodes/python.el (python-define-auxiliary-skeleton):
* lisp/progmodes/sql.el (sql-comint):
* lisp/progmodes/verilog-mode.el (verilog-load-file-at-point):
* lisp/server.el (server-get-auth-key):
* lisp/subr.el (version-to-list):
* lisp/textmodes/reftex-ref.el (reftex-label):
* lisp/textmodes/reftex-toc.el (reftex-toc-rename-label):
* lisp/vc/ediff-diff.el (ediff-same-contents):
* lisp/vc/vc-cvs.el (vc-cvs-mode-line-string):
* test/automated/tramp-tests.el (tramp-test33-asynchronous-requests):
Use directed rather than neutral quotes in diagnostics.
2015-08-24 23:57:25 -07:00

203 lines
7.5 KiB
EmacsLisp

;;; metamail.el --- Metamail interface for GNU Emacs
;; Copyright (C) 1993, 1996, 2001-2015 Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp>
;; Keywords: mail, news, mime, multimedia
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Note: Metamail does not have all the options which are compatible with
;; the environment variables. For that reason, metamail.el has to
;; hack the environment variables. In addition, there is no way to
;; display all header fields without extra informative body messages
;; which are suppressed by the "-q" option.
;; The idea of using metamail to process MIME messages is from
;; gnus-mime.el by Spike <Spike@world.std.com>.
;;; Code:
(defvar rmail-current-message)
(defvar rmail-message-vector)
(defgroup metamail nil
"Metamail interface for Emacs."
:group 'mail
:group 'processes)
(defcustom metamail-program-name "metamail"
"Metamail program name."
:type 'string
:group 'metamail)
(defcustom metamail-mailer-name "emacs"
"Mailer name set to MM_MAILER environment variable."
:type 'string
:group 'metamail)
(defvar metamail-environment '("KEYHEADS=*" "MM_QUIET=1")
"Environment variables passed to `metamail'.
It must be a list of strings that have the format ENVVARNAME=VALUE.
It is not expected to be altered globally by `set' or `setq'.
Instead, change its value temporary using `let' or `let*' form.")
(defcustom metamail-switches '("-x" "-d" "-z")
"Switches for `metamail' program.
`-z' is required to remove zap file.
It is not expected to be altered globally by `set' or `setq'.
Instead, change its value temporary using `let' or `let*' form.
`-m MAILER' argument is automatically generated from the
`metamail-mailer-name' variable."
:type '(repeat (string :tag "Switch"))
:group 'metamail)
;;;###autoload
(defun metamail-interpret-header ()
"Interpret a header part of a MIME message in current buffer.
Its body part is not interpreted at all."
(interactive)
(save-excursion
(let* ((buffer-read-only nil)
(metamail-switches ;Inhibit processing an empty body.
(append metamail-switches '("-c" "text/plain" "-E" "7bit")))
(end (progn
(goto-char (point-min))
(search-forward "\n\n" nil 'move)
;; An extra newline is inserted by metamail if there
;; is no body part. So, insert a dummy body by
;; itself.
(insert "\n")
(point))))
(metamail-region (point-min) end nil nil 'nodisplay)
;; Remove an extra newline inserted by myself.
(goto-char (point-min))
(if (search-forward "\n\n\n" nil t)
(delete-char -1))
)))
;;;###autoload
(defun metamail-interpret-body (&optional viewmode nodisplay)
"Interpret a body part of a MIME message in current buffer.
Optional argument VIEWMODE specifies the value of the
EMACS_VIEW_MODE environment variable (defaulted to 1).
Optional argument NODISPLAY non-nil means buffer is not
redisplayed as output is inserted.
Its header part is not interpreted at all."
(interactive "p")
(save-excursion
(let ((contype nil)
(encoding nil)
(end (progn
(goto-char (point-min))
(search-forward "\n\n" nil t)
(point))))
;; Find Content-Type and Content-Transfer-Encoding from the header.
(save-restriction
(narrow-to-region (point-min) end)
(setq contype
(or (mail-fetch-field "Content-Type") "text/plain"))
(setq encoding
(or (mail-fetch-field "Content-Transfer-Encoding") "7bit")))
;; Interpret the body part only.
(let ((metamail-switches ;Process body part only.
(append metamail-switches
(list "-b" "-c" contype "-E" encoding))))
(metamail-region end (point-max) viewmode nil nodisplay))
;; This mode specific hack is no longer appropriate in mbox Rmail.
;; Pre-mbox, we have just modified the actual folder, so we
;; update the message-vector with the new end position of the
;; current message. In mbox Rmail, all we have done is modify a
;; display copy of the message. Note also that point-max is a
;; marker in the wrong buffer: the message-vector contains
;; markers in rmail-view-buffer (which is not in rmail-mode).
;; So this hack actually breaks the message-vector.
;; If you're calling this on the actual rmail-view-buffer (or a
;; non-swapped rmail-buffer), you would still need this hack.
;; But you're not going to do that.
;;; (cond ((eq major-mode 'rmail-mode)
;;; ;; Adjust the marker of this message if in Rmail mode buffer.
;;; (set-marker (aref rmail-message-vector (1+ rmail-current-message))
;;; (point-max))))
)))
;;;###autoload
(defun metamail-buffer (&optional viewmode buffer nodisplay)
"Process current buffer through `metamail'.
Optional argument VIEWMODE specifies the value of the
EMACS_VIEW_MODE environment variable (defaulted to 1).
Optional argument BUFFER specifies a buffer to be filled (nil
means current).
Optional argument NODISPLAY non-nil means buffer is not
redisplayed as output is inserted."
(interactive "p")
(metamail-region (point-min) (point-max) viewmode buffer nodisplay))
;;;###autoload
(defun metamail-region (beg end &optional viewmode buffer nodisplay)
"Process current region through `metamail'.
Optional argument VIEWMODE specifies the value of the
EMACS_VIEW_MODE environment variable (defaulted to 1).
Optional argument BUFFER specifies a buffer to be filled (nil
means current).
Optional argument NODISPLAY non-nil means buffer is not
redisplayed as output is inserted."
(interactive "r\np")
(let ((curbuf (current-buffer))
(buffer-read-only nil)
(metafile (make-temp-file "metamail"))
(option-environment
(list (format "EMACS_VIEW_MODE=%d"
(if (numberp viewmode) viewmode 1)))))
(save-excursion
;; Gee! Metamail does not output to stdout if input comes from
;; stdin.
(let ((selective-display nil)) ;Disable ^M to nl translation.
(write-region beg end metafile nil 'nomessage))
(if buffer
(set-buffer buffer))
(setq buffer-read-only nil)
;; Clear destination buffer.
(if (eq curbuf (current-buffer))
(delete-region beg end)
(delete-region (point-min) (point-max)))
;; We have to pass the environment variable KEYHEADS to display
;; all header fields. Metamail should have an optional argument
;; to pass such information directly.
(let ((process-environment
(append process-environment
metamail-environment option-environment))
(coding-system-for-read 'undecided))
(apply (function call-process)
metamail-program-name
nil
t ;Output to current buffer
(not nodisplay) ;Force redisplay
(append metamail-switches
(list "-m" (or metamail-mailer-name "emacs"))
(list metafile))))
;; `metamail' may not delete the temporary file!
(condition-case error
(delete-file metafile)
(error nil))
)))
(provide 'metamail)
;;; metamail.el ends here