X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Fmm-util.el;h=a8e8f8bd0586bd8c7bee3bf5b378475853239b86;hb=3aca09c100b6c60da9524bebf9c9eed6ad3e0174;hp=1807327317c788bced7c2b4105806c73ff3a3db4;hpb=7554e4249c821770633b5aea99298d92bf1e5b5d;p=elisp%2Fgnus.git- diff --git a/lisp/mm-util.el b/lisp/mm-util.el index 1807327..a8e8f8b 100644 --- a/lisp/mm-util.el +++ b/lisp/mm-util.el @@ -24,27 +24,18 @@ ;;; Code: -(defvar mm-running-xemacs (string-match "XEmacs" emacs-version)) +(defconst mm-running-xemacs (string-match "XEmacs" emacs-version)) -(defvar mm-running-ntemacs - (and (not mm-running-xemacs) - (string-match "nt" system-configuration))) - -(defvar mm-binary-coding-system +(defconst mm-binary-coding-system (if mm-running-xemacs 'binary 'no-conversion) "100% binary coding system.") -(defvar mm-text-coding-system - (cond - ((not (fboundp 'coding-system-p)) nil) - (mm-running-xemacs ;; XEmacs - 'no-conversion) - (mm-running-ntemacs ;; NTEmacs - (and (coding-system-p 'raw-text-dos) 'raw-text-dos)) - ((coding-system-p 'raw-text) 'raw-text) ;; Emacs - (t nil)) - "100% text coding system, for removing ^M.") +(defconst mm-text-coding-system + (and (fboundp 'coding-system-list) + (if (memq system-type '(windows-nt ms-dos ms-windows)) + 'raw-text-dos 'raw-text)) + "Text-safe coding system (For removing ^M).") (defvar mm-mime-mule-charset-alist '((us-ascii ascii) @@ -59,9 +50,7 @@ (iso-8859-8 hebrew-iso8859-8) (iso-8859-9 latin-iso8859-9) (viscii vietnamese-viscii-lower) - (iso-2022-jp-2 japanese-jisx0208) - (iso-2022-jp latin-jisx0201 - japanese-jisx0208-1978) + (iso-2022-jp latin-jisx0201 japanese-jisx0208 japanese-jisx0208-1978) (euc-kr korean-ksc5601) (cn-gb-2312 chinese-gb2312) (cn-big5 chinese-big5-1 chinese-big5-2) @@ -126,10 +115,21 @@ (defvar mm-charset-synonym-alist '((big5 . cn-big5) (gb2312 . cn-gb-2312) - (iso-2022-jp-2 . iso-2022-7bit-ss2) (x-ctext . ctext)) "A mapping from invalid charset names to the real charset names.") +(defconst mm-auto-save-coding-system + (cond + ((memq 'emacs-mule (mm-get-coding-system-list)) + (if (memq system-type '(windows-nt ms-dos ms-windows)) + 'emacs-mule-dos 'emacs-mule)) + ((memq 'escape-quoted (mm-get-coding-system-list)) + 'escape-quoted) + ((memq 'no-conversion (mm-get-coding-system-list)) + 'no-conversion) + (t nil)) + "Coding system of auto save file.") + ;;; Internal variables: ;;; Functions: @@ -186,6 +186,7 @@ used as the line break code type of the coding system." (defsubst mm-enable-multibyte () "Enable multibyte in the current buffer." (when (and (fboundp 'set-buffer-multibyte) + (boundp 'enable-multibyte-characters) (default-value 'enable-multibyte-characters)) (set-buffer-multibyte t))) @@ -194,18 +195,22 @@ used as the line break code type of the coding system." (when (fboundp 'set-buffer-multibyte) (set-buffer-multibyte nil))) +(defun mm-preferred-coding-system (charset) + ;; A typo in some Emacs versions. + (or (get-charset-property charset 'prefered-coding-system) + (get-charset-property charset 'preffered-coding-system))) + (defun mm-mime-charset (charset) "Return the MIME charset corresponding to the MULE CHARSET." (if (fboundp 'coding-system-get) ;; This exists in Emacs 20. (or - (and (get-charset-property charset 'prefered-coding-system) + (and (mm-preferred-coding-system charset) (coding-system-get - (get-charset-property charset 'prefered-coding-system) - 'mime-charset)) + (mm-preferred-coding-system charset) 'mime-charset)) (and (eq charset 'ascii) 'us-ascii) - (get-charset-property charset 'prefered-coding-system) + (mm-preferred-coding-system charset) (mm-mule-charset-to-mime-charset charset)) ;; This is for XEmacs. (mm-mule-charset-to-mime-charset charset))) @@ -216,6 +221,8 @@ used as the line break code type of the coding system." (mapcar 'mm-mime-charset (delq 'ascii (mm-find-charset-region b e))))) + (when (memq 'iso-2022-jp-2 charsets) + (setq charsets (delq 'iso-2022-jp charsets))) (delete-duplicates charsets))) (defsubst mm-multibyte-p () @@ -287,6 +294,44 @@ See also `with-temp-file' and `with-output-to-string'." mm-mime-mule-charset-alist) nil t))) +(defun mm-quote-arg (arg) + "Return a version of ARG that is safe to evaluate in a shell." + (let ((pos 0) new-pos accum) + ;; *** bug: we don't handle newline characters properly + (while (setq new-pos (string-match "[]*[;!'`\"$\\& \t{} |()<>]" arg pos)) + (push (substring arg pos new-pos) accum) + (push "\\" accum) + (push (list (aref arg new-pos)) accum) + (setq pos (1+ new-pos))) + (if (= pos 0) + arg + (apply 'concat (nconc (nreverse accum) (list (substring arg pos))))))) + +(defun mm-auto-mode-alist () + "Return an `auto-mode-alist' with only the .gz (etc) thingies." + (let ((alist auto-mode-alist) + out) + (while alist + (when (listp (cdar alist)) + (push (car alist) out)) + (pop alist)) + (nreverse out))) + +(defun mm-insert-file-contents (filename &optional visit beg end replace) + "Like `insert-file-contents', q.v., but only reads in the file. +A buffer may be modified in several ways after reading into the buffer due +to advanced Emacs features, such as file-name-handlers, format decoding, +find-file-hooks, etc. + This function ensures that none of these modifications will take place." + (let ((format-alist nil) + (auto-mode-alist (mm-auto-mode-alist)) + (default-major-mode 'fundamental-mode) + (enable-local-variables nil) + (after-insert-file-functions nil) + (enable-local-eval nil) + (find-file-hooks nil)) + (insert-file-contents filename visit beg end replace))) + (provide 'mm-util) ;;; mm-util.el ends here