Skip to content

Emacs 30 Antinews ​

For those users who live backwards in time, here is information about downgrading to Emacs version 30.2. We hope you will enjoy the greater simplicity that results from the absence of many Emacs 31.1 features.

  • Lisp strings are now mutable. You can use aset on unibyte strings to replace single bytes by multibyte characters, and aset on multibyte strings can replace any character by any other character, regardless if they are ASCII or multibyte non-ASCII. We feel those restrictions are un-Emacsy and get in the way of doing all kinds of exciting things with strings.

  • Buffers that are current to a non-main thread cannot be killed by other threads. We decided to get rid of the numerous complications which were needed to allow killing such buffers. If your program needs to kill such buffers, you will need to use a disciplined approach of first making some other buffer current to the thread.

  • We removed the early detection of faces that inherit from themselves. As you move back in time, Emacs Lisp programmers become more and more proficient, so disallowing such tricks feels wrong. Those who don’t know well enough what they are doing will be amply punished by having their Lisp programs barf at display time or even wedge Emacs cold.

  • Calling debug in batch mode now kills Emacs. We decided that there’s no sense in continuing a batch session that entered the debugger: who and how will debug it, anyway?

    For the same reason, C-c in batch mode now always kills Emacs, it never quits.

  • The functions that access and manipulate error descriptors were deleted. Functions like error-type, error-slot-value and others are useless bloat, since Lisp programs can simply access the data structure directly, as God intended!

  • We removed frame-initial-p, as its job can easily be done by testing several obscure variables and frame parameters.

  • We’ve added the redisplay-dont-pause variable, so we could allow interrupting a runaway redisplay cycle in one of the past versions of Emacs.

  • There’s no longer a guarantee that all the digit characters will have the digit (?6) category. We feel that such silly consistency robs Lisp programmers of too much fun, whereby they should discover which digits have this category by trial-and-error.

    For the same reason, not all characters belonging to the symbol script will have the symbol (?5) category.

  • Lisp programs can now easily delete that daemon frame by calling delete-frame, as with any other frame. We decided there’s no reason to make a special case for the daemon frames, especially as some past Emacs version will remove the daemon feature entirely.

  • Lisp files found on load-path are no longer cached. We intend to make the load-path list shorter and shorter as we move to previous versions of Emacs, so caching files is an unnecessary complication and bloat of precious memory.

  • The annoying warning about the missing lexical-binding cookie when loading Lisp files was removed. This is one more step towards eventual elimination of lexical binding from Emacs in one of the past versions.

    For the same reason, Lisp files loaded via the -x and --script command-line options no longer use lexical binding by default.

  • To keep Emacs clean and elegant, we deleted the setopt-local macro. This was one more useless bloat, since it is easy to do the same using setq-local, and avoids the annoying warnings about mismatch between the value and expected type defined by defcustom.

  • Pure storage is now part of Emacs, and is here to stay. The function purecopy really copies its argument to pure storage. This is a significant step towards making Emacs more memory-efficient on yesterday’s computers, and more generally towards using unexec as the only way of dumping Emacs.

  • The cond* macro was removed. You can still use pcase instead, but better start using the venerable cond exclusively, as pcase and its ilk will disappear from Emacs in the near past. No one should need these fancy and hard-to-read constructs with their obscure semantics and myriads of backticks! The original control-flow special forms of the pristine Emacs Lisp are more than enough.

  • Xref commands automatically suggest visiting a tags table. This is to enable symbol completion,and generally move towards removing all backends except the etags one in some past Emacs version.

  • Support for SHA-3 message digests was removed from the function secure-hash. We plan to continue removing algorithms from this function, so as to keep Emacs as lean as possible. Eventually, just one kind of digest should be enough for everyone!

  • We deleted unnecessary functions like incf, decf, plusp, minusp, oddp, and evenp. Use the corresponding functions from cl-lib or just write these trivial functions when you need them. For the same reason, all, any, drop-while, and take-while are also gone.

  • As part of the ongoing quest for simplicity, many other functions and variables have been eliminated. Other functions and variables, that were declared obsolete since Emacs 25, have been added back, in preparation for releasing Emacs 25 in some distant past.