+2003-04-24 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * lisp/nnheader.el (nnheader-coding-system-p): New function.
+ (mm-coding-system-p): Alias to `nnheader-coding-system-p'.
+
2003-04-23 Katsumi Yamaoka <yamaoka@jpl.org>
* lisp/gnus-clfns.el (coerce, copy-list, merge, string, subseq):
+2003-04-24 Dave Love <fx@gnu.org>
+
+ * qp.el (quoted-printable-decode-region): Use mm-insert-byte.
+ Signal error on malformed text, as for base64.
+ (quoted-printable-encode-region): DTRT in Emacs 22.
+
+ * mm-util.el (mm-make-temp-file, mm-insert-byte): New.
+ (mm-auto-save-coding-system): Consider utf-8-emacs.
+ (mm-mime-mule-charset-alist, mm-mule-charset-to-mime-charset)
+ (mm-charset-to-coding-system, mm-mime-charset)
+ (mm-find-mime-charset-region): Check for :mime-charset coding
+ systems property.
+
+ * mml-sec.el (mml2015, mml1991): Don't require.
+ (mml2015-sign, mml2015-encrypt, mml1991-sign, mml1991-encrypt)
+ (message-goto-body, mml-insert-tag): Autoload.
+
+ * mm-decode.el (mm-tmp-directory): Re-write to help avoid warnings.
+
+ * gnus-start.el (message-make-date): Autoload rather than
+ requiring message.
+
+ * gnus-group.el (gnus-group-name-charset-group-alist): Use
+ mm-coding-system-p.
+ (gnus-cache-active-altered): Defvar when compiling.
+ (gnus-group-delete-group): Re-write to help avoid warnings.
+
+ * gnus-art.el (gnus-use-idna): Use mm-coding-system-p.
+
+ * pgg.el: Split eval-when-compile forms.
+
+2003-04-24 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-group.el (gnus-large-ephemeral-newsgroup)
+ (gnus-fetch-old-ephemeral-headers): News variables.
+ (gnus-group-read-ephemeral-group): Use them.
+
+2003-04-24 Simon Josefsson <jas@extundo.com>
+
+ * sieve.el (sieve-upload): Don't use replace-regexp-in-string.
+
+ * nnrss.el (nnrss-node-text): Ditto.
+
2003-04-24 Katsumi Yamaoka <yamaoka@jpl.org>
* gnus-msg.el (gnus-inews-do-gcc): Make sure the obsolete variable
"Function used for converting HTML into text.")
(defcustom gnus-use-idna (and (condition-case nil (require 'idna) (file-error))
- (fboundp 'coding-system-p)
- (coding-system-p 'utf-8))
+ (mm-coding-system-p 'utf-8))
"Whether IDNA decoding of headers is used when viewing messages.
This requires GNU Libidn, and by default only enabled if it is found."
:group 'gnus-article-headers
;; [Note] Now there are three kinds of mule implementations,
;; original MULE, XEmacs/mule and Emacs 20+ including
- ;; MULE features. Unfortunately these API are different. In
- ;; particular, Emacs (including original MULE) and XEmacs are
+ ;; MULE features. Unfortunately these APIs are different. In
+ ;; particular, Emacs (including original Mule) and XEmacs are
;; quite different. However, this version of Gnus doesn't support
;; anything other than XEmacs 20+ and Emacs 20.3+.
;; Predicates to check are following:
- ;; (boundp 'MULE) is t only if MULE (original; anything older than
+ ;; (boundp 'MULE) is t only if Mule (original; anything older than
;; Mule 2.3) is running.
- ;; (featurep 'mule) is t when every mule variants are running.
+ ;; (featurep 'mule) is t when other mule variants are running.
;; It is possible to detect XEmacs/mule by (featurep 'mule) and
- ;; checking `emacs-version'. In this case, the implementation for
+ ;; (featurep 'xemacs). In this case, the implementation for
;; XEmacs/mule may be shareable between XEmacs and XEmacs/mule.
(defvar gnus-summary-display-table nil
:type '(repeat (cons (sexp :tag "Method") (symbol :tag "Charset"))))
(defcustom gnus-group-name-charset-group-alist
- (if (or (and (fboundp 'find-coding-system) (find-coding-system 'utf-8))
- (and (fboundp 'coding-system-p) (coding-system-p 'utf-8)))
+ (if (mm-coding-system-p 'utf-8)
'(("[^\000-\177]" . utf-8))
nil)
"Alist of group regexp and the charset for group names.
result)))
(defun gnus-group-name-decode (string charset)
+ ;; Fixme: Don't decode in unibyte mode.
(if (and string charset (featurep 'mule))
(decode-coding-string string charset)
string))
(defvar gnus-ephemeral-group-server 0)
+(defcustom gnus-large-ephemeral-newsgroup 200
+ "The number of articles which indicates a large ephemeral newsgroup.
+Same as `gnus-large-newsgroup', but only used for ephemeral newsgroups.
+
+If the number of articles in a newsgroup is greater than this value,
+confirmation is required for selecting the newsgroup. If it is nil, no
+confirmation is required."
+ :group 'gnus-group-select
+ :type '(choice (const :tag "No limit" nil)
+ integer))
+
+(defcustom gnus-fetch-old-ephemeral-headers nil
+ "Same as `gnus-fetch-old-headers', but only used for ephemeral newsgroups."
+ :group 'gnus-thread
+ :type '(choice (const :tag "off" nil)
+ (const some)
+ number
+ (sexp :menu-tag "other" t)))
+
;; Enter a group that is not in the group buffer. Non-nil is returned
;; if selection was successful.
(defun gnus-group-read-ephemeral-group (group method &optional activate
(if request-only
group
(condition-case ()
- (when (gnus-group-read-group t t group select-articles)
+ (when (let ((gnus-large-newsgroup gnus-large-ephemeral-newsgroup)
+ (gnus-fetch-old-headers
+ gnus-fetch-old-ephemeral-headers))
+ (gnus-group-read-group t t group select-articles))
group)
;;(error nil)
(quit
(lambda (group)
(gnus-group-delete-group group nil t))))))
+(eval-when-compile (defvar gnus-cache-active-altered))
+
(defun gnus-group-delete-group (group &optional force no-prompt)
"Delete the current group. Only meaningful with editable groups.
If FORCE (the prefix) is non-nil, all the articles in the group will
(gnus-group-goto-group group)
(gnus-group-kill-group 1 t)
(gnus-sethash group nil gnus-active-hashtb)
- (when (and (boundp 'gnus-cache-active-hashtb)
- gnus-cache-active-hashtb)
- (gnus-sethash group nil gnus-cache-active-hashtb)
- (setq gnus-cache-active-altered t))
+ (if (boundp 'gnus-cache-active-hashtb)
+ (when gnus-cache-active-hashtb
+ (gnus-sethash group nil gnus-cache-active-hashtb)
+ (setq gnus-cache-active-altered t)))
t))
(gnus-group-position-point)))
(require 'gnus-spec)
(require 'gnus-range)
(require 'gnus-util)
-(require 'message)
+(autoload 'message-make-date "message")
(defcustom gnus-startup-file (nnheader-concat gnus-home-directory ".newsrc")
"Your `.newsrc' file.
(or (gnus-group-name-charset method name)
(gnus-parameter-charset name)
gnus-default-charset)))
+ ;; Fixme: Don't decode in unibyte mode.
(when (and str charset (featurep 'mule))
(setq str (decode-coding-string str charset)))
(set group str)))
;; Added by Geoffrey T. Dairiki <dairiki@u.washington.edu>. A safe way
;; to limit the length of a string. This function is necessary since
;; `(substr "abc" 0 30)' pukes with "Args out of range".
+;; Fixme: Why not `truncate-string-to-width'?
(defsubst gnus-limit-string (str width)
(if (> (length str) width)
(substring str 0 width)
str))
+;; Fixme: This is incomplete, but why not just use functionp? In
+;; fact, that is used in various places.
(defsubst gnus-functionp (form)
"Return non-nil if FORM is funcallable."
(or (and (symbolp form) (fboundp form))
(while (search-backward "\\." nil t)
(delete-char 1)))))
+;; Fixme: Why not use `with-output-to-temp-buffer'?
(defmacro gnus-with-output-to-file (file &rest body)
(let ((buffer (make-symbol "output-buffer"))
(size (make-symbol "output-buffer-size"))
(string-equal (downcase x) (downcase y)))))
(defcustom gnus-use-byte-compile t
- "If non-nil, byte-compile crucial run-time codes.
-Setting it to nil has no effect after first time running
-`gnus-byte-compile'."
+ "If non-nil, byte-compile crucial run-time code.
+Setting it to nil has no effect after the first time `gnus-byte-compile'
+is run."
:type 'boolean
:version "21.1"
:group 'gnus-various)
(- x ?0)))
(defun gnus-url-unhex-string (str &optional allow-newlines)
- "Remove %XXX embedded spaces, etc in a url.
+ "Remove %XX, embedded spaces, etc in a url.
If optional second argument ALLOW-NEWLINES is non-nil, then allow the
decoding of carriage returns and line feeds in the string, which is normally
forbidden in URL encoding."
display))
display)))))
+;; Fixme: This has only one use (in gnus-agent), which isn't worthwhile.
(defmacro gnus-mapcar (function seq1 &rest seqs2_n)
"Apply FUNCTION to each element of the sequences, and make a list of the results.
If there are several sequences, FUNCTION is called with that many arguments,
;; Adapted from cl-seq.el
(defun gnus-merge (type list1 list2 pred)
"Destructively merge lists LIST1 and LIST2 to produce a new list.
+Argument TYPE is for compatibility and ignored.
Ordering of the elements is preserved according to PRED, a `less-than'
predicate on the elements."
(let ((res nil))
:group 'mime-display)
(defcustom mm-tmp-directory
- (cond ((fboundp 'temp-directory) (temp-directory))
- ((boundp 'temporary-file-directory) temporary-file-directory)
- ("/tmp/"))
+ (if (fboundp 'temp-directory)
+ (temp-directory)
+ (if (boundp 'temporary-file-directory)
+ temporary-file-directory
+ "/tmp/"))
"Where mm will store its temporary files."
:type 'directory
:group 'mime-display)
(string-as-unibyte . identity)
(string-make-unibyte . identity)
(string-as-multibyte . identity)
- (multibyte-string-p . ignore))))
+ (multibyte-string-p . ignore)
+ (insert-byte . insert-char)
+ (multibyte-char-to-unibyte . identity))))
(eval-and-compile
(defalias 'mm-char-or-char-int-p
(defvar mm-auto-save-coding-system
(cond
+ ((mm-coding-system-p 'utf-8-emacs) ; Mule 7
+ (if (memq system-type '(windows-nt ms-dos ms-windows))
+ (if (mm-coding-system-p 'utf-8-emacs-dos)
+ 'utf-8-emacs-dos mm-binary-coding-system)
+ 'utf-8-emacs))
((mm-coding-system-p 'emacs-mule)
(if (memq system-type '(windows-nt ms-dos ms-windows))
(if (mm-coding-system-p 'emacs-mule-dos)
'nconc
(mapcar
(lambda (cs)
- (when (and (coding-system-get cs 'mime-charset)
+ (when (and (or (coding-system-get cs :mime-charset) ; Emacs 22
+ (coding-system-get cs 'mime-charset))
(not (eq t (coding-system-get cs 'safe-charsets))))
- (list (cons (coding-system-get cs 'mime-charset)
+ (list (cons (or (coding-system-get cs :mime-charset)
+ (coding-system-get cs 'mime-charset))
(delq 'ascii
(coding-system-get cs 'safe-charsets))))))
(sort-coding-systems (coding-system-list 'base-only))))))
iso-latin-1 utf-8)))))
"Preferred coding systems for encoding outgoing mails.
-More than one suitable coding systems may be found for some texts. By
-default, a coding system with the highest priority is used to encode
+More than one suitable coding system may be found for some text. By
+default, the coding system with the highest priority is used to encode
outgoing mails (see `sort-coding-systems'). If this variable is set,
it overrides the default priority."
:type '(repeat (symbol :tag "Coding system"))
:group 'mime)
+;; ??
(defvar mm-use-find-coding-systems-region
(fboundp 'find-coding-systems-region)
"Use `find-coding-systems-region' to find proper coding systems.
(find-coding-systems-for-charsets (list charset)))))
(unless mime
(when cs
- (setq mime (coding-system-get cs 'mime-charset)))))
+ (setq mime (or (coding-system-get cs :mime-charset)
+ (coding-system-get cs 'mime-charset))))))
mime)
(let ((alist mm-mime-mule-charset-alist)
out)
;; Do we need -lbt?
(dolist (c (mm-get-coding-system-list))
(if (and (null cs)
- (eq charset (coding-system-get c 'mime-charset)))
+ (eq charset (or (coding-system-get c :mime-charset)
+ (coding-system-get c 'mime-charset))))
(setq cs c)))
cs))))
;; This exists in Emacs 20.
(or
(and (mm-preferred-coding-system charset)
- (coding-system-get
- (mm-preferred-coding-system charset) 'mime-charset))
+ (or (coding-system-get
+ (mm-preferred-coding-system charset) :mime-charset)
+ (coding-system-get
+ (mm-preferred-coding-system charset) 'mime-charset)))
(and (eq charset 'ascii)
'us-ascii)
(mm-preferred-coding-system charset)
(when mm-coding-system-priorities
(setq systems
(sort systems 'mm-sort-coding-systems-predicate)))
- ;; Fixme: The `mime-charset' (`x-ctext') of `compound-text'
- ;; is not in the IANA list.
(setq systems (delq 'compound-text systems))
(unless (equal systems '(undecided))
(while systems
- (let ((cs (coding-system-get (pop systems) 'mime-charset)))
- (if cs
+ (let* ((head (pop systems))
+ (cs (or (coding-system-get head :mime-charset)
+ (coding-system-get head 'mime-charset))))
+ ;; The mime-charset (`x-ctext') of
+ ;; `compound-text' is not in the IANA list. We
+ ;; shouldn't normally use anything here with a
+ ;; mime-charset having an `x-' prefix.
+ ;; Fixme: allow this to be overridden, since
+ ;; there is existing use of x-ctext.
+ ;; Also people apparently need the coding system
+ ;; `iso-2022-jp-3', which Mule-UCS defines.
+ (if (and cs
+ (not (string-match "^[Xx]-" (symbol-name cs))))
(setq systems nil
charsets (list cs))))))
charsets))
- ;; Otherwise we're not multibyte, XEmacs or a single coding
- ;; system won't cover it.
+ ;; Otherwise we're not multibyte, we're XEmacs or a single
+ ;; coding system won't cover it.
(setq charsets
(mm-delete-duplicates
(mapcar 'mm-mime-charset
(put 'mm-with-unibyte-buffer 'edebug-form-spec '(body))
(defmacro mm-with-unibyte-current-buffer (&rest forms)
- "Evaluate FORMS with current current buffer temporarily made unibyte.
+ "Evaluate FORMS with current buffer temporarily made unibyte.
Also bind `default-enable-multibyte-characters' to nil.
Equivalent to `progn' in XEmacs"
(let ((multibyte (make-symbol "multibyte"))
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.
-If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers.
+If INHIBIT is non-nil, inhibit `mm-inhibit-file-name-handlers'.
This function ensures that none of these modifications will take place."
(let ((format-alist nil)
(auto-mode-alist (if inhibit nil (mm-auto-mode-alist)))
;;; Code:
-(require 'mml2015)
-(require 'mml1991)
(require 'mml-smime)
(eval-when-compile (require 'cl))
+(autoload 'mml2015-sign "mml2015")
+(autoload 'mml2015-encrypt "mml2015")
+(autoload 'mml1991-sign "mml1991")
+(autoload 'mml1991-encrypt "mml1991")
+(autoload 'message-goto-body "message")
+(autoload 'mml-insert-tag "mml")
(defvar mml-sign-alist
'(("smime" mml-smime-sign-buffer mml-smime-sign-query)
temporary-file-directory))))
(if dir-flag
(make-directory file))
- file)))))
+ file))))
+
+ ;; Should keep track of `mm-coding-system-p' in mm-util.el.
+ (defun nnheader-coding-system-p (sym)
+ "Return non-nil if SYM is a coding system."
+ (or (and (fboundp 'find-coding-system) (find-coding-system sym))
+ (and (fboundp 'coding-system-p) (coding-system-p sym))))
+ (defalias 'mm-coding-system-p 'nnheader-coding-system-p))
;; mail-parse stuff.
(unless (featurep 'mail-parse)
(text (if (and node (listp node))
(nnrss-node-just-text node)
node))
- (cleaned-text (if text
- (replace-regexp-in-string
- " *$" "" (replace-regexp-in-string
- "^ *" "" (replace-regexp-in-string
- "^[[:cntrl:]]+" "" text))))))
+ (cleaned-text (if text (gnus-replace-regexp-in-string
+ (gnus-replace-regexp-in-string
+ (gnus-replace-regexp-in-string
+ text "^[[:cntrl:]]+" "")
+ "^ *" "")
+ " *$" ""))))
(if (string-equal "" cleaned-text)
nil
cleaned-text)))
;;; qp.el --- Quoted-Printable functions
-;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: mail, extensions
(require 'mm-util)
(eval-when-compile (defvar mm-use-ultra-safe-encoding))
+;;;###autoload
(defun quoted-printable-decode-region (from to &optional coding-system)
"Decode quoted-printable in the region between FROM and TO, per RFC 2045.
If CODING-SYSTEM is non-nil, decode bytes into characters with that
coding-system.
Interactively, you can supply the CODING-SYSTEM argument
-with \\[universal-coding-system-argument]."
+with \\[universal-coding-system-argument].
+
+The CODING-SYSTEM argument is a historical hangover and is deprecated.
+QP encodes raw bytes and should be decoded into raw bytes. Decoding
+them into characters should be done separately."
(interactive
;; Let the user determine the coding system with "C-x RET c".
(list (region-beginning) (region-end) coding-system-for-read))
(let ((byte (string-to-int (buffer-substring (1+ (point))
(+ 3 (point)))
16)))
- (insert byte)
- (delete-char 3)
- ;; Why backward-char???
- ;;(unless (eq byte 61) ;; 61 is not ?= in XEmacs
- ;; (backward-char))
- ))
+ (mm-insert-byte byte 1)
+ (delete-char 3)))
(t
- (message "Malformed quoted-printable text")
+ (error "Malformed quoted-printable text")
(forward-char)))))
(if coding-system
(mm-decode-coding-region (point-min) (point-max) coding-system)))))
If `mm-use-ultra-safe-encoding' is set, fold lines unconditionally and
encode lines starting with \"From\"."
(interactive "r")
+ (save-excursion
+ (goto-char from)
+ (if (fboundp 'string-to-multibyte) ; Emacs 22
+ (if (re-search-forward (string-to-multibyte "[^\x0-\x7f\x80-\xff]")
+ to t)
+ ;; Fixme: This is somewhat misleading.
+ (error "Multibyte character in QP encoding region"))
+ (if (re-search-forward (mm-string-as-multibyte "[^\0-\377]") to t)
+ (error "Multibyte character in QP encoding region"))))
(unless class
;; Avoid using 8bit characters. = is \075.
;; Equivalent to "^\000-\007\013\015-\037\200-\377="
(save-excursion
(save-restriction
(narrow-to-region from to)
- ;; We can live with characters between 00-FF.
- (goto-char (point-min))
- (while (not (eobp))
- (if (>= (char-after) 256)
- (error "Multibyte character in QP encoding region"))
- (forward-char))
;; Encode all the non-ascii and control characters.
(goto-char (point-min))
(while (and (skip-chars-forward class)
(not (eobp)))
(insert
(prog1
- (format "=%02X" (char-after))
+ ;; To unibyte in case of Emacs 22 eight-bit.
+ (format "=%02X" (mm-multibyte-char-to-unibyte (char-after)))
(delete-char 1))))
;; Encode white space at the end of lines.
(goto-char (point-min))
(and (boundp 'mm-use-ultra-safe-encoding)
mm-use-ultra-safe-encoding)))
(when (or fold mm-use-ultra-safe-encoding)
- (let ((tab-width 1)) ; HTAB is one character.
+ (let ((tab-width 1)) ; HTAB is one character.
(goto-char (point-min))
(while (not (eobp))
;; In ultra-safe mode, encode "From " at the beginning
(if (sieve-manage-ok-p err)
(message (concat
"Sieve upload done. Use `C-c RET' to manage scripts."))
- (message "Sieve upload failed: %s"
- (replace-regexp-in-string "[\n\r\t]+" " " (nth 2 err))))))))
+ (message "Sieve upload failed: %s" (nth 2 err)))))))
;;;###autoload
(defun sieve-upload-and-bury (&optional name)
+2003-04-24 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Selecting a Group): Add gnus-large-ephemeral-newsgroup.
+ (Filling In Threads): Add gnus-fetch-old-ephemeral-headers.
+ (Terminology): Index.
+
2003-04-22 Jesper Harder <harder@ifa.au.dk>
* gnus.texi: nil -> @code{nil}. Capitalize "Rmail" and "Babyl"
\e$B$r<hF@$7$^$9!#@5$N?t$G$"$l$P!"?7$7$/E~Ce$7$?J}$+$i\e(B @code{n} \e$B8D$N5-;v$r<h\e(B
\e$BF@$7$^$9!#\e(B
+@vindex gnus-large-ephemeral-newsgroup
+@code{gnus-large-newsgroup} \e$B$HF1$8$G$9$,!"0l;~%K%e!<%9%0%k!<%W$N$?$a$K$@\e(B
+\e$B$1;H$o$l$^$9!#\e(B
+
@vindex gnus-select-group-hook
@vindex gnus-auto-select-first
@vindex gnus-auto-select-subject
\e$B$O2?$b$"$j$^$;$s$,!"L?Na\e(B @kbd{A T} \e$B$r$h$/;H$&$N$G$"$l$PLr$KN)$D$G$7$g\e(B
\e$B$&\e(B (@pxref{Finding the Parent})\e$B!#\e(B
+@item gnus-fetch-old-ephemeral-headers
+@vindex gnus-fetch-old-ephemeral-headers
+@code{gnus-fetch-old-headers} \e$B$HF1$8$G$9$,!"0l;~%K%e!<%9%0%k!<%W$N$?$a$K\e(B
+\e$B$@$1;H$o$l$^$9!#\e(B
+
@item gnus-build-sparse-threads
@vindex gnus-build-sparse-threads
\e$B8E$$%X%C%@!<$r<hF@$9$k$HCY$/$J$k$3$H$,$"$j$^$9!#F1$8$h$&$JDcDB6b$N8z2L$r\e(B
@item \e$B0l;~%0%k!<%W\e(B (ephemeral groups)
@cindex ephemeral groups
+@cindex temporary groups
\e$B$?$$$F$$$N%0%k!<%W$O$I$N5-;v$rFI$s$@$+$N%G!<%?$rC_@Q$7$^$9!#\e(B
@dfn{\e$B0l;~\e(B} \e$B%0%k!<%W$O%G!<%?$,N/$a$i$l$J$$%0%k!<%W$G$9\e(B---\e$B%0%k!<%W$r=P$k$H!"\e(B
\e$B$=$l$OE76u$K>C$(5n$j$^$9!#\e(B
is positive, the @code{n} articles that have arrived most recently will
be fetched.
+@vindex gnus-large-ephemeral-newsgroup
+Same as @code{gnus-large-newsgroup}, but only used for ephemeral
+newsgroups.
+
@vindex gnus-select-group-hook
@vindex gnus-auto-select-first
@vindex gnus-auto-select-subject
visible effects, but is useful if you use the @kbd{A T} command a lot
(@pxref{Finding the Parent}).
+@item gnus-fetch-old-ephemeral-headers
+@vindex gnus-fetch-old-ephemeral-headers
+Same as @code{gnus-fetch-old-headers}, but only used for ephemeral
+newsgroups.
+
@item gnus-build-sparse-threads
@vindex gnus-build-sparse-threads
Fetching old headers can be slow. A low-rent similar effect can be
@item ephemeral groups
@cindex ephemeral groups
+@cindex temporary groups
Most groups store data on what articles you have read. @dfn{Ephemeral}
groups are groups that will have no data stored---when you exit the
group, it'll disappear into the aether.