What’s New In Emacs 24.4

Well, it’s that time of the year again. There’s a new Emacs minor release due out any day now, and it’s become something of a tradition for me to annotate the NEWS file. Of course, “minor” is a relative term here: this release is full of tweaks and changes and is anything but.

At the time of this writing Emacs 24.4 is in feature freeze; no major changes will get in, but the list of changes you see below is not set in stone – but it almost never changes much. Only if there’s a major bug or issue will items get pulled from the release.

If you’re anxious to get started you’ll have to pull down the source and build Emacs yourself.

Oh, one more thing. I’ve only converted the NEWS file but not reorganized it; some changes appear under the wrong headings in the NEWS file. I haven’t changed that at all.

What’s New In Emacs 24.4

Installation Changes in Emacs 24.4

Emacs can now be compiled with ACL support.

This happens by default if a suitable support library is found at

build time, like libacl on GNU/Linux. To prevent this, use the

configure option --disable-acl.

This is excellent news if your flavor of Linux supports ACL. The

extent of Emacs’s support of ACL is unknown, but I doubt it’s all that

sophisticated yet. It’s unlikely dired will know how to set ACL.

Emacs can now be compiled with file notification support.

This happens by default if a suitable system library is found at

build time. To prevent this, use the configure option

--with-file-notification-no. See below for file-notify features.

FIXME? This feature is not available for the Nextstep port. (?)

Nice. I’ll talk about this further down.

The configure option --without-compress-info has been generalized,

and renamed to --without-compress-install. It now prevents compression

of _any_ files during installation.

The configure option --with-crt-dir has been removed.

It is no longer needed, as the crt*.o files are no longer linked


Directories passed to configure option --enable-locallisppath are

no longer created during installation.

Emacs can be compiled with zlib support.

If this library is present (which it normally is on most systems), the

function zlib-decompress-region becomes available, which can

decompress gzip- and zlib-format compressed data.

More data compression support for Emacs. No word if auto-compression-mode will support it out of the box. I presume so.

Emacs for NS (OSX, GNUStep) can be built with ImageMagick support.

pkg-config is required to find ImageMagick libraries.

For OSX >= 10.5, the Core text based font backend from the Mac port is used.

For GNUStep and OSX 10.4 the old backend is used.

To use the old backend by default, do on the command line:

% defaults write org.gnu.Emacs FontBackend ns

Startup Changes in Emacs 24.4

When initializing load-path, an empty element in the EMACSLOADPATH

environment variable (either leading, e.g., “:/foo”; trailing, e.g.,

“/foo:”; or embedded, e.g., “/foo::/bar”) is replaced with the default

load-path (the one that would have been used if EMACSLOADPATH was unset).

This makes it easier to _extend_ the load-path via EMACSLOADPATH

(previously, EMACSLOADPATH had to specify the complete load-path,

including the defaults). (In older versions of Emacs, an empty element

was replaced by “.”, so use an explicit “.” now if that is what you want.)

Great if you’re the sort that sets the emacs load path from the commandline - perhaps to support multiple Emacs setups for different purposes. Beware the last gotcha.

The -L option, which normally prepends its argument to load-path,

will instead append, if the argument begins with : (or ; on MS Windows;

i.e., path-separator).

Another potential gotcha if you use the -L option.

If you use either site-load.el or site-init.el to customize the dumped

Emacs executable, any changes to load-path that these files make

will no longer be present after dumping. To affect a permanent change

to load-path, use the --enable-locallisppath option of configure.

The user option initial-buffer-choice can now specify a function

to set up the initial buffer.

Nice. Now you can make Emacs go fetch the latest dilbert comic and display it whenever you launch your Emacs.

Changes in Emacs 24.4

New option gnutls-verify-error, if non-nil, means that Emacs

should reject SSL/TLS certificates that GnuTLS determines as invalid.

(This option defaults to nil at present, but this is expected to change

in a future release.)

Emacs now supports menus on text-mode terminals.

If the terminal supports a mouse, clicking on the menu bar, or on

sensitive portions of the mode line or header line, will drop down the

menu defined at that position. Likewise, clicking C-mouse-2 or

C-mouse-2 or C-mouse-3 on the text area will pop up the menus defined

for those locations.

If the text terminal does not support a mouse, you can activate the

first menu-bar menu by typing F10, which invokes menu-bar-open.

If you want the previous behavior, whereby F10 invoked tmm-menubar,

customize the option tty-menu-open-use-tmm to a non-nil value.

(Typing M-\` will always invoke tmm-menubar, even if

tty-menu-open-use-tmm is nil.)

Great news for beginners of Emacs who mistakenly use Emacs in a terminal instead of in a window manager.

The *Messages* buffer is created in messages-buffer-mode,

a new major mode, with read-only status. Any code that might create

the *Messages* buffer should call the function messages-buffer to do

so and set up the mode.

Emacs now supports ACLs (access control lists).

Emacs preserves the ACL entries of files when backing up.

Very important indeed if you rely on ACL to protect your files.

New functions file-acl and set-file-acl get and set the ACL

entries of a file. On GNU/Linux, the POSIX ACL interface is used via

libacl. On MS-Windows, the NT Security APIs are used to emulate the

POSIX ACL interfaces.

Nice that ACL support works natively with Windows’s as well. The Windows ACL system is extremely advanced and I wonder what sort of concessions were made to keep the interface unified and easy to use.

Multi-monitor support has been added.

New functions display-monitor-attributes-list and

frame-monitor-attributes can be used to obtain information about

each physical monitor on multi-monitor setups.

Interesting that Emacs has added support for multiple monitors. What the extent of this is – spanning a frame across multiple monitors, perhaps? – is currently unknown.

The functions display-pixel-width and display-pixel-height now

behave consistently among the platforms: they return the pixel width

or height for all physical monitors associated with the given display

as just they were on X11. To get information for each physical

monitor, use the new functions above. Similar notes also apply to

x-display-pixel-width, x-display-pixel-height, display-mm-width,

display-mm-height, x-display-mm-width, and x-display-mm-height.

This is potentially very important for packages like pos-tip that constructs a nice tooltip replacement for Emacs and thus needs to know where and how to draw itself.

The cursor stops blinking after 10 blinks (by default) on X and NS.

You can change the default by customizing blink-cursor-blinks.

I wonder how many surveys, usability studies, committee meetings and research went into deciding it must be ten blinks and not nine or eleven. I personally disable blinking carets/cursors everywhere.

In keymaps where SPC scrolls forward, S-SPC now scrolls backward.

This affects View mode, etc.

Useful, and a similar mnemonic to alt+tab / shift+alt+tab for task switching.

Help changes

The command apropos-variable is renamed to apropos-user-option.

apropos-user-option shows all user options while apropos-variable

shows all variables. When called with a universal prefix argument,

the two commands swap their behaviors. When apropos-do-all is

non-nil, they output the same results.

Useful for people who only want customize options displayed, and with a switch to re-enable the old behavior.

The key ? now describes prefix bindings, like C-h.

Excellent. I can’t think of any prefix bindings that uses ?.

The command quail-help is deleted. Use C-h C-\

(describe-input-method) instead.

Frame and window changes

New commands toggle-frame-fullscreen and toggle-frame-maximized,

bound to <f11> and M-<f10>, respectively.

This is probably a big win for a lot of people. I wrote an article on how to maximize Emacs on startup. The fact the topic needs mentioning at all is a testament to how complicated it is to get consistent behavior on every platform.

Not too sure about the key bindings though.

New command frameset-to-register is now bound to C-x r f, replacing

frame-configuration-to-register. It offers similar functionality,

plus enhancements like the ability to restore deleted frames. The

command frame-configuration-to-register still exists, but is unbound.

Great news if you use register configurations a lot for windows or frames. Its use is perhaps of greater importance to package writers.

New hooks focus-in-hook, focus-out-hook.

These are normal hooks run when an Emacs frame gains or loses input focus.

I look forward to seeing what people will use this for!

split-window is now a non-interactive function, not a command.

As a command, it was a special case of C-x 2 (split-window-below),

and as such superfluous. After being reimplemented in Lisp, its

interactive form was mistakenly retained.

Unlikely that too many people call this command directly.

New option scroll-bar-adjust-thumb-portion.

Available only on X, this option allows to control over-scrolling

using the scroll bar (i.e. dragging the thumb down even when the end

of the buffer is visible).

Lisp evaluation changes

eval-defun on an already defined defcustom calls the :set function,

if there is one.

A zero prefix arg of eval-last-sexp (C-x C-e),

eval-expression (M-:) and eval-print-last-sexp (C-j) inserts

a list with no limit on its length and level (by using nil values of

print-length and print-level), and inserts additional formats for

integers (octal, hexadecimal, and character).

That’s very handy!

write-region-inhibit-fsync now defaults to t in batch mode.

This should speed up batch calls at the cost of some data loss if the writes haven’t been flushed to disk yet.

cache-long-line-scans has been renamed to cache-long-scans

because it affects caching of paragraph scanning results as well.

The option set-mark-default-inactive has been deleted.

This unfinished feature was introduced by accident in Emacs 23.1;

simply disabling Transient Mark mode does the same thing.

The default value of comment-use-global-state is changed to t,

and this variable has been marked obsolete.

New user options

read-regexp-defaults-function defines a function to read regexps,

used by commands like rgrep, lgrep occur, highlight-regexp,

etc. You can customize this to specify a function that provides a

default value from the regexp last history element, or from the symbol

found at point.

This is great news for package authors as you had to roll your own prompt and make sure you pointed to a shared history varaible, etc. - this is a massive timesaver and should make it easier for Emacs hackers to override how they enter regexps.

load-prefer-newer, affects how the load function chooses the

file to load. If this is non-nil, then when both .el and .elc

versions of a file exist, and the caller did not explicitly specify

which one to load, then the newer file is loaded. The default, nil,

means to always load the .elc file.

Editing Changes in Emacs 24.4

Indentation changes

The behavior of C-x TAB (indent-rigidly) has changed.

When invoked without a prefix argument, it now activates a transient

mode in which typing <left>, <right>, <S-left>, and <S-right> adjusts

the text indentation in the region. Typing any other key resumes

normal editing behavior.

By default it would indent by ARG (usually 1 column) but this is more in line with what people might expect coming from other text editors, and it marks a shift towards a more “heavy weight” and inclusive transient mark mode, which I think is a good thing.

electric-indent-mode is enabled by default.

Contentious. I found it hard to tame this beast when it was first introduced and its behavior, while flexible, left some things to be desired. This goes for the other electric modes as well, like electric-pair-mode.

tab-stop-list is now implicitly extended to infinity by repeating

the last step. Its default value is changed to nil which means a tab

stop every tab-width columns.

I nixed tab-stop-list and all that stuff ages ago as it just got in the way, exactly for the reasons outlined above. (That and a general aversion to having tab characters in my files.) This at least makes its behavior consistent.

Filling changes

New command cycle-spacing cycles between spacing conventions:

having just one space, no spaces, or reverting to the original

spacing. Like just-one-space, it can handle or ignore newlines and

leave different number of spaces.

Useful function, but between just-one-space and delete-blank-lines I find they cover my needs fully. I’ll have to try to work cycle-spacing into my workflow - but as it’s not bound to a key it’ll most likely never get used.

fill-single-char-nobreak-p prevents fill from breaking a line after

a 1-letter word, which is an error according to Polish and

Czech typography rules. To globally enable this feature, evaluate:

(add-hook ’fill-nobreak-predicate ’fill-single-char-nobreak-p)

Good news for people of Polish or Czech persuasion.

Uniquify is enabled by default with post-forward-angle-brackets style.


New command C-x SPC (rectangle-mark-mode) makes a rectangular region.

Most commands are still unaware of it, but kill/yank do work on the rectangle.

Like I mentioned earlier - this is a move towards a more unified and inclusive transient mark mode. The rectangle stuff in Emacs kind-of works with transient (in that it only cares about point and mark, and not the highlighted transient mark region) – but with this, CUA-mode’s only advantage over TMM is finally gone?

New option visual-order-cursor-movement.

If this is non-nil, cursor motion with arrow keys will follow the

visual order of characters on the screen: <left> always moves to the

left, <right> always moves to the right, disregarding the surrounding

bidirectional context.

Register changes

All register commands can now show help with preview.

New command C-x C-k x (kmacro-to-register) stores keyboard

macros in registers.

Potentially useful; but you can already cycle the macro ring with kmacro-cycle-ring-<next/previous> so its use is limited.

New command C-x r f (frameset-to-register).

See Changes in Emacs 24.4, above.

New command delete-duplicate-lines.

When its arg ADJACENT is non-nil (when called interactively with C-u

C-u) it works like the utility uniq. Otherwise by default it

deletes duplicate lines everywhere in the region without regard to

adjacency. When its arg KEEP-BLANKS is non-nil (when called

interactively with C-u C-u C-u), duplicate blank lines are preserved.

This is a great addition for those of us who do a lot of text munging in Emacs. It’s also one more thing Emacs can do without custom Elisp or a call to a shell command.

Changes in Specialized Modes and Packages in Emacs 24.4

More packages look for ~/.emacs.d/<foo> additionally to ~/.<foo>.

Affected files:

~/.emacs.d/timelog replaces ~/.timelog

~/.emacs.d/vip replaces ~/.vip

~/.emacs.d/viper replaces ~/.viper

~/.emacs.d/ido.last replaces ~/.ido.last

~/.emacs.d/kkcrc replaces ~/.kkcrc

~/.emacs.d/quickurls replaces ~/.quickurls

~/.emacs.d/idlwave replaces ~/.idlwave

~/.emacs.d/bdfcache.el replaces ~/.bdfcache.el

~/.emacs.d/places replaces ~/.emacs-places

~/.emacs.d/shadows replaces ~/.shadows

~/.emacs.d/shadow_todo replaces ~/.shadow_todo

~/.emacs.d/strokes replaces ~/.strokes

~/.emacs.d/notes replaces ~/.notes

~/.emacs.d/type-break replaces ~/.type-break

Also the following files used by the now obsolete otodo-mode.el:

~/.emacs.d/todo-do replaces ~/.todo-do

~/.emacs.d/todo-done replaces ~/.todo-done

~/.emacs.d/todo-top replaces ~/.todo-top

This should end Emacs clogging your home directory with crap. That’s a good thing!

Backtrace and debugger

The Lisp debugger’s e command now includes the lexical environment

when evaluating the code in the context at point. Hence, it now lets

you access lexical variables.

As we move towards lexical scoping, for all the pros and cons of doing so, this will undoubtedly be useful in tracking down pesky scoping issues.

New command v (debugger-toggle-locals) displays local vars.

A sorely missed feature of most debuggers finally arrives in Emacs.

New minor mode jit-lock-debug-mode lets you use the debuggers on

code run via JIT Lock.


Battery information via the BSD apm utility is now supported.

Buffer Menu

M-s a C-o shows lines matching a regexp in marked buffers using Occur.

Calendar and Diary

New faces calendar-weekday-header, calendar-weekend-header,

and calendar-month-header.

New option calendar-day-header-array.

New variable diary-from-outlook-function, used by the command


The variable calendar-font-lock-keywords is obsolete.


Calc by default now uses the Gregorian calendar for all dates, and

uses January 1, 1 AD as its day number 1. Previously Calc used the

Julian calendar for dates before September 14, 1752, and it used

December 31, 1 BC as its day number 1; the new scheme is more

consistent with Calendar’s calendrical system and day numbering.

The new variable calc-gregorian-switch lets you configure the

date when Calc switches from the Julian to the Gregorian calendar.

Nil, the default value, means to always use the Gregorian calendar.

The value (YEAR MONTH DAY) means to start using the Gregorian calendar

on the given date.

Support for ISO 8601 dates.

Dates and time is one thing calc never handled too well. It could do with a lot more functions to manipulate time and date.



The cpp-root project now supports executing a compile command.

It can be set through the new :compile-command slot or the

buffer-local variable compile-command.

Better selection of include directories for the ‘linux’ project.

Include directories now support out-of-tree build directories and

target architecture auto-detection.


Improved detection of used namespaces in current scope in C++.

Parsing of default values for variables and function arguments in C/C++.

They are also displayed by the summarize feature in the modeline.

Improved parsing of function pointers in C/C++.

This also includes parsing of function pointers as function arguments.

Parsing of C/C++ preprocessor macros which open new scope.

For example, this enables parsing of macros which open new namespaces.

Support for ‘this’ pointer in inline member functions in C++.


New macro cl-tagbody.

letf is now just an alias for cl-letf.

CUA mode

CUA mode now uses delete-selection-mode and shift-select-mode.

Hence, you can now enable it independently from transient-mark-mode,

delete-selection-mode, and shift-select-mode.

cua-highlight-region-shift-only is now obsolete.

You can disable transient-mark-mode to get the same result.

CUA’s rectangles can now be used via cua-rectangle-mark-mode.

So now we have two; the old way of doing proper rectangles (via CUA) and a newer way via rectangle-mark-mode. Here’s to hoping that one day we’ll just have one mode.

CFEngine mode

Support for completion, ElDoc, and Flycheck has been added.

The current CFEngine syntax is parsed from “cf-promises -s json”.

There is a fallback syntax available if you don’t have cf-promises or

if it doesn’t support that option.

Delete Selection mode can now be used without transient-mark-mode.


desktop-auto-save-timeout defines the number of seconds idle time

before auto-save of the desktop.

desktop-restore-frames, enabled by default, allows saving and

restoring the frame/window configuration (frameset). Additional options

desktop-restore-in-current-display, desktop-restore-reuses-frames

and desktop-restore-forces-onscreen offer further customization.

This is no doubt the end goal for adding frameset marshalling to Emacs - so desktop, et al. can restore it correctly. Great news indeed.


New minor mode dired-hide-details-mode hides details.

For when details must be obscured.

Eldoc Mode works properly in the minibuffer.

Electric Pair mode

New electric-pair-preserve-balance enabled by default.

Pairing/skipping only kicks in when that help the balance of

parentheses and quotes, i.e. the buffer should end up at least as

balanced as before.

You can further control this behaviour by adjusting the predicates

stored in electric-pair-inhibit-predicate and


Hopefully this works “as intended” without creating more headaches than it tries to cure.

New electric-pair-delete-adjacent-pairs enabled by default.

In electric-pair-mode, the commands backward-delete-char and

backward-delete-char-untabify are now bound to electric variants

that delete the closer when invoked between adjacent pairs.

As before, this is a great change and one I’ve been using for a long time by advising backward-kill-word.

New electric-pair-open-newline-between-pairs enabled by default.

In electric-pair-mode, inserting a newline between adjacent pairs

opens an extra newline after point, which is indented if

electric-indent-mode is also set.

One of the problems I had with electric-pair-mode is that it lacked support for a lot of the language-specific syntax quirks when it came to paired characters. These additions should go a long way towards fixing them all.

New electric-pair-skip-whitespace enabled by default.

Controls if skipping over closing delimiters should jump over any

whitespace slack. Setting it to chomp makes it delete this

whitespace. See also the variable


New variables control the pairing in strings and comments.

You can customize electric-pair-text-pairs and

electric-pair-text-syntax-table to tweak pairing behaviour inside

strings and comments.


New option epa-mail-aliases.

You can set this to a list of alias expansions for keys to use

in epa-mail-encrypt.

If one element of the variable’s value is (“foo@bar.com” “foo@hello.org”),

that means: when one of the recipients of the message being encrypted

is foo@bar.com, encrypt the message for foo@hello.org instead.

If one element of the variable’s value is (“foo@bar.com”),

that means: when one of the recipients of the message being encrypted

is foo@bar.com, ignore that name as regards encryption.

This is useful to avoid a query when you have no key for that name.


New option erc-accidental-paste-threshold-seconds.

If set to a number, this can be used to avoid accidentally paste large

amounts of data into the ERC input.

Built-in client-side flood detection. Very handy.


New macro skip-unless allows skipping ERT tests.

See the ERT manual for details.


eshell now supports visual subcommands and options

Eshell has been able to handle “visual” commands (interactive,

non-line oriented commands such as top that require display

capabilities not provided by eshell) by running them in an Emacs

terminal emulator. See eshell-visual-commands.

This feature has been extended to subcommands and options that make a

usually line-oriented command a visual command. Typical examples are

“git log” and “git –help” which display their output in a

pager by default. See eshell-visual-subcommands and


The first part – using a terminal emulator – is a big change for eshell users. Beforehand it kind of did something of the same but not nearly as well; by using ansi-term you get to have your cake and eat it. Still, it’d be great to see terminal emulation built into eshell.

Speaking of subcommands and options: disabling $PAGER completely in shell or eshell is much better. Emacs is a far better pager than any external program will ever be.

Added Eshell-Tramp module

External su and sudo commands are now the default; the internal,

Tramp-using variants can still be used by enabling the eshell-tramp


TRAMP is awesome but it can be temperamental. By using the proper external ones the woes some of you experience should end.

F90 mode

New option f90-smart-end-names.

Icomplete is a bit more like Ido. Key bindings to navigate through and select the completions.

The icomplete-separator is customizable, and its default has changed.

Removed icomplete-show-key-bindings.

Icomplete-mode by defaults applies to all forms of minibuffer completion.

(setq icomplete-with-completion-tables ’(internal-complete-buffer))

will revert to the old behavior.

This is part of a larger push to render the default completion engine redundant and replace it with a cross between IDO and iswitchb. This is generally a good move, I believe; switching buffers without ido or iswitchb is tedious at best. Adding to that, IDO has its own quirks and a re-implementation might be in hand. I might just give icomplete a whirl instead of IDO now.


Ido has a manual now.

Alternatively you can read my article: Introduction to Ido Mode.

ido-use-virtual-buffers takes a new value ’auto.

ido-decorations has been slightly extended to give a bit more control.

Image mode

New commands n (image-next-file) and p (image-previous-file)

visit the next image file and the previous image file in the same

directory, respectively.

And with one fell swoop Emacs becomes a much better image browser.

New commands to show specific frames of multi-frame images.

f (image-next-frame) and b (image-previous-frame) visit the

next or previous frame. F (image-goto-frame) shows a specific frame.

I just tested this functionality and it works great on GIFs.

Find subliminal messages hidden in all those lolcat GIFs you watch.

New commands to speed up, slow down, or reverse animation.

The command image-mode-fit-frame deletes other windows.

When toggling, it restores the frame’s previous window configuration.

It also has an optional frame argument, which can be used by Lisp

callers to fit the image to a frame other than the selected frame.


New option hi-lock-auto-select-face. When non-nil, hi-lock commands

will cycle through faces in hi-lock-face-defaults without prompting.

Oh yes. Thank you. This will automatically pick a highlight face for you instead of you having to select it. Very useful.

New global command M-s h . (highlight-symbol-at-point)

highlights the symbol found near point without prompting,

using the next face automatically.

Another timesaver.


New option imenu-generic-skip-comments-and-strings.

Avoids false positives from having function/method definitions in comments or strings.


New face info-index-match is used to highlight matches in index

entries displayed by Info-index-next, Info-virtual-index and


JS Mode

Better indentation of multiple-variable declarations.

If declaration spans several lines, variables on the following lines

are lined up to the first one.

We now recognize and better indent continuations in array


New option js-switch-indent-offset`.

MH-E has been updated to MH-E version 8.5.

See MH-E-NEWS for details.

Octave mode

Font locking for texinfo comments and new keywords

Completion in Octave file buffers

Eldoc support

Jump to definition

Documentation lookup/search

Code cleanup and various bug fixes

OPascal mode is the new name for Delphi mode.

All delphi-* variables and functions have been renamed to opascal-*.

`delphi-newline-always-indents is not supported any more.

Use electric-indent-mode instead.

delphi-tab is gone, replaced by indent-for-tab-command.


The format of archive-contents files, generated by package

repositories, has changed to allow a new (fifth) element in the data

vectors, containing an associative list with extra properties.

describe-package buffer uses the :url extra property to

display a Homepage header, if it’s present.

Sorely needed.

In the buffer produced by describe-package, there are now buttons

listing the keywords related to that package. You can click on them

to see other packages related to any given keyword.

In the *Packages* buffer, f or the Package->Filter menu filters

the packages by a keyword.

Prolog mode

prolog-use-smie has been removed, along with the non-SMIE

indentation code.


The new command remember-notes creates a buffer which is saved

on kill-emacs.

You may think of it as a *scratch* buffer whose content is preserved.

In fact, it was designed as a replacement for *scratch* buffer and can

be used that way by setting initial-buffer-choice to

remember-notes and remember-notes-buffer-name to “*scratch*”.

Without the second change, *scratch* buffer will still be there for

notes that do not need to be preserved.

The Remember package can now store notes in separates files.

You can use the new function remember-store-in-files within the

remember-handler-functions option.

See remember-data-directory and remember-directory-file-name-format

for new options related to this function.


Customize rmail-mbox-format to influence some minor aspects of

how Rmail displays non-MIME messages.

The unrmail command now converts from BABYL to mboxrd format,

rather than mboxo. Customize unrmail-mbox-format to change this.

Ruby mode

New option ruby-encoding-magic-comment-style.

New option ruby-custom-encoding-magic-comment-template.

New mode menu.

Improved syntax highlighting and indentation.

Add more Ruby file types to auto-mode-alist.

New option ruby-align-to-stmt-keywords.

New electric-indent-mode integration.

Search and Replace

New global command M-s . (isearch-forward-symbol-at-point)

starts a symbol (identifier) incremental search forward with the

symbol found near point added to the search string initially.

About time. Isearch is great and all but this was a missing step. I still recommend you use my Smart Scan package though. (It’s on MELPA.)

C-x 8 RET in Isearch mode reads a character by its Unicode name

and adds it to the search string.

Good. It was awkward having to do it outside isearch; you’d need recursive minibuffers to then insert it with registers if you also wanted to yank stuff.

M-s i in Isearch mode toggles the variable isearch-invisible

between nil and the value of the option search-invisible (or open

when it’s nil).

query-replace skips invisible text when search-invisible is nil,

and opens overlays with hidden text when search-invisible is open.

A negative prefix arg of replacement commands replaces backward.

M-- M-% replaces a string backward, M-- C-M-% replaces a regexp

backward, M-s w words M-- M-% replaces a sequence of words backward.

Useful for macros if you rely on point/mark to do your replacing and not just TMM.

By default, prefix arguments do not now terminate Isearch mode.

Set isearch-allow-prefix to nil to restore old behavior.

More Isearch commands accept prefix arguments, namely

isearch-printing-char, isearch-quote-char, isearch-yank-word,


Word search now matches whitespace at the beginning/end

of the search string if it contains leading/trailing whitespace.

In an incremental word search or when using a non-nil LAX argument

of word-search-regexp, the lax matching can also match part of

the first word (in addition to the lax matching of the last word).

The same rules are now applied to the symbol search with the difference

that it matches symbols, and non-symbol characters between symbols.

This should make it easier to find all those search strings delimited by an artibtrary amount of spacing.


New command ses-rename-cell allows assigning names to SES cells.


explicit-bash-args now always defaults to use –noediting.

During initialization, Emacs no longer expends a process to decide

whether it is safe to use Bash’s –noediting option. These days

–noediting is ubiquitous; it was introduced in 1996 in Bash version 2.

A bit of house keeping. Always nice.

Shell Script mode

sh-mode now has the mode own add-log-current-defun-function.

You can pick the name of the function and the variables with C-x 4 a.

If you use sh-mode and ChangeLog files, this is for you.

The SMIE indentation engine is now used by default.

SMIE indentation can be customized via smie-config.

The customization can be guessed by Emacs by providing a sample indented

file and letting SMIE learn from it.

This is actually a really cool indentation engine that was added in Emacs 23 I believe.

Term mode

New option term-suppress-hard-newline.

UPDATE: This fixes the annoying issue in Emacs’s terminal emulator where the text would not wrap like a normal terminal would. Emacs used to hard break if the text exceeded the size of the original window - but now it won’t.

Todo mode has been rewritten and enhanced.

New features include:

  • support for multiple todo files and archive files of done items;
  • renaming, reordering, moving, merging, and deleting categories;
  • sortable tabular summaries of categories and the types of items they contain;
  • cross-category lists of items filtered by specific criteria;
  • more fine-grained interaction with the Emacs diary, by being able to decide

for each todo item whether it appears in the Fancy Diary display;

  • highly flexible new item insertion and item editing;
  • moving items between categories, storing done items in their category or in

archive files, undoing or unarchiving done items;

  • reprioritizing items by inputting a numerical priority;
  • extensive customizability of operation and display, including numerous faces.

The Todo mode user manual describes all commands and most user options.

To support some of these features, a new file format is used, which is

incompatible with the old format; however, you can convert old todo and done

item files to the new format on initializing the first new todo file, or at any

later time with the provided conversion command. The old version of

todo-mode.el has been made obsolete and renamed otodo-mode.el.

I’ve never used todo-mode, having always preferred orgmode for this. Perhaps I’ll take a look now that it has been given a major revamp.

trace-function was largely rewritten.

New features include:

  • no prompting for the destination buffer, unless a prefix-arg was used.
  • additionally to prompting for a destination buffer, when a prefix-arg is

used, the user can enter a “context”, i.e. Lisp expression whose value at the

time the function is entered/exited will be printed along with the function

name and arguments. Useful to trace the value of (current-buffer) or

(point) when the function is invoked.


The experimental url syntax for remote file names is withdrawn.

New connection method “adb”, which allows to access Android

devices by the Android Debug Bridge. The variable tramp-adb-program

can be used to adapt the path of the “adb” program, if needed.

Very cool news for Android hackers.

The connection methods “plink1”, “ssh2”, “ssh2”, “scp1”, “scp2”,

“scpc” and “rsyncc” are discontinued. The ssh option

“ControlMaster=auto” is set automatically in all ssh-based methods,

when possible.

Handlers for file-acl and set-file-acl for remote machines

which support POSIX ACLs.

Impressive that ACL support also works for remote files.

Handlers for file-notify-add-watch and file-notify-rm-watch

for remote machines which support filesystem notifications.

This is a big one for me; auto-revert-tail-mode is fantastic but over TRAMP it made many requests - hopefully this will cut down on unnecessary requests.

In VC directory mode, D displays diffs between VC-controlled

whole tree revisions.

In VC directory mode, L lists the change log for the current VC

controlled tree in a window.

In VC directory mode, I shows a log of changes that will be

received with a pull operation.

C-x v G (globally) and G (in VC directory mode) ignores a file

under current version control system. When called with a prefix

argument, you can remove a file from the ignored file list.

Very useful if you’re a heavy user of VC like I am.

cvs-append-to-ignore has been renamed to vc-cvs-append-to-ignore

because it is moved to vc-cvs.el.

VHDL mode

New options: vhdl-actual-generic-name, vhdl-beautify-options.

New commands: vhdl-fix-statement-region, vhdl-fix-statement-buffer.


The commands woman-default-faces and woman-monochrome-faces

are obsolete. Customize the woman-* faces instead.

Obsolete packages:

Iswitchb is made obsolete by icomplete-mode.

longlines.el is obsolete; use visual-line-mode instead.


terminal.el is obsolete; use term.el instead.

The previous version of todo-mode.el is obsolete and renamed otodo-mode.el.


yow.el is obsolete; use fortune.el or cookie1.el instead.

The Info-edit command is obsolete. Editing Info nodes by hand

has not been relevant for some time.

New Modes and Packages in Emacs 24.4

New package eww is a built-in web browser.

It is only available if Emacs is compiled with libxml2 support.

Wow! This is great. w3m was a major pain in the neck to get working right sometimes, and it was never really that good. This browser actually does a pretty good job. It renders images, tables and most HTML elements. A perfectly adequate alternative for most browsers if all you want to do is read text. Combine it with a web-based RSS reader or a site like readability and you’re in business! It does a pretty good job rendering this blog.

New minor mode superword-mode, defined in subword.el

superword-mode overrides the default word motion commands to treat

symbol_words as a single word, similar to what subword-mode does and

using the same internal functions.

A nice addition indeed. subword-mode is great for camelCase languages.

New package nadvice.el offers lighter-weight advice facilities.

It is layered as:

  • add-function/remove-function which can be used to add/remove code on any

function-carrying place, such as process-filters or <foo>-function hooks.

  • advice-add/advice-remove to add/remove a piece of advice on a named function,

much like defadvice does.

Both add/remove-function looks very useful.

New package frameset.el.

It provides a set of operations to save a frameset (the state of all

or a subset of the existing frames and windows, somewhat similar to a

frame configuration), both in-session and persistently, and restore it

at some point in the future.

New package filenotify.el provides an interface for file system

notifications. It requires that Emacs be compiled with one of the

low-level libraries gfilenotify.c, inotify.c or w32notify.c.

Excellent for people who rely on external tools to update files they’re editing or generally interested in.

Incompatible Lisp Changes in Emacs 24.4

kill-region lost its yank-handler optional argument.

(input-pending-p) no longer runs other timers which are ready to

run. The new optional CHECK-TIMERS param allows for the prior behavior.

defvar and defcustom in a let-binding affect the “external” default.

The syntax of ?» and ?« is now punctuation instead of matched parens.

Some languages match those as »…« and others as «…» so better stay neutral.

In compiled Lisp files, the header no longer includes a timestamp.

This is probably to avoid tripping up source control systems?

The default file coding for Emacs Lisp files is now utf-8.

(See file-coding-system-alist.) In most cases, this change is

transparent, but files that contain unusual characters without

specifying an explicit coding system may fail to load with obscure

errors. You should either convert them to utf-8 or add an explicit

coding: cookie.

A sane default for most of us, I think.

overriding-terminal-local-map no longer replaces the local keymaps.

It used to disable the minor mode, major mode, and text-property keymaps,

whereas now it simply has higher precedence.

Default process filters and sentinels are not nil any more.

Instead they default to a function which does what the nil value used to do.

read-event does not return decoded chars in ttys any more.

As was the case in Emacs 22 and before, the decoding of terminal

input, according to keyboard-coding-system, is not performed in

read-event any more. But unlike in Emacs 22, this decoding is still

done before input-decode-map, function-key-map, etc.

Removed inhibit-local-menu-bar-menus.

Frame-local variables that affect redisplay do not work any more.

More specifically, the redisplay does not bother to check for a frame-local

value when looking up variables.

nil and “unbound” are indistinguishable in symbol-function.

symbol-function does not signal a void-function error any more.

To determine if a symbol’s function definition is void, use fboundp.

defadvice does not honor the freeze flag and cannot advise

special-forms any more.

dolist no longer binds VAR while evaluating the RESULT form,

when lexical binding is enabled. Previously, VAR was bound to nil,

which often led to spurious unused-variable warnings.

The return value of backup-buffer has changed.

The second argument is no longer an SELinux context, instead it is an

alist of extended attributes as returned by the new function

file-extended-attributes. The attributes can be applied to another

file using set-file-extended-attributes.

visited-file-modtime now returns -1 for nonexistent files.

Formerly it returned a list (-1 LOW USEC PSEC), but this was ambiguous

in the presence of files with negative time stamps.

The cars of the elements in interpreter-mode-alist are now

treated as regexps rather than literal strings.

Lisp Changes in Emacs 24.4

The second argument of eval can now specify a lexical environment.

This could have interesting applications for evaluating code with different contexts - perhaps as part of a greater push for concurrency ?

New functions special-form-p and macrop.

New macro define-alternatives can be used to define generic commands.

Generic commands are interactive functions whose implementation can be

selected among several alternatives, as a matter of user preference.

The defalias-fset-function property lets you catch defalias

calls, and redirect them to your own function, instead of fset.

Docstrings can be made dynamic by adding a dynamic-docstring-function

text-property on the first char.

New variable enable-dir-local-variables.

Directory-local variables are ignored if this is nil. This may be

useful for modes that want to ignore directory-locals while still

respecting file-local variables.

New function get-pos-property.

Completion changes

The separator for completing-read-multiple can now be a regexp.

The default separator has been changed to allow surrounding spaces

around the comma.

The common-substring arg of display-completion-list is obsolete.

Either use completion-all-completions, which returns highlighted

strings (including for partial or substring completion), or call

completion-hilit-commonality to add the highlight.

Terminal changes

Functions to pop up menus and dialogs now work on all terminals,

including TTYs. This includes x-popup-menu, x-popup-dialog,

message-box, yes-or-no-p, etc.

The function display-popup-menus-p will now return non-nil for a

display or frame whenever a mouse is supported on that display or


New hook tty-setup-hook.

New hook pre-redisplay-function.

New bool-vector set operation functions:









Helper functions - always a good thing.

Comparison functions =, <, >, = now take many arguments.

Ah yes - that’s a nice change.

Error-handling changes

No idea what?

New function define-error.

with-demoted-errors takes an additional argument format.

New macro with-eval-after-load. Like eval-after-load, but better behaved.

New library subr-x.el for misc helper functions












More functions for manipulating strings?! Awesome! This is one part Elisp is sorely lacking. A large part is perhaps that if you want to manipulate strings you should use a buffer (advice I agree with, by the way) – but sometimes it’s just not that simple.

Obsoleted functions:









get-upcase-table (use case-table-get-table instead).

with-wrapper-hook is obsoleted by add-function.

The few hooks that used with-wrapper-hook are replaced as follows:

abbrev-expand-function obsoletes abbrev-expand-functions.

completion-in-region-function obsoletes completion-in-region-functions.

filter-buffer-substring-function obsoletes filter-buffer-substring-functions.

byte-compile-interactive-only-functions is now obsolete.

It has been replaced by the symbol property ’interactive-only.

split-string now takes an optional argument TRIM.

The value, if non-nil, is a regexp that specifies what to trim from

the start and end of each substring.

This makes split-string all the more useful

New function string-suffix-p.


File-handling changes

Support for filesystem notifications.

Emacs now supports notifications of filesystem changes, such as

creation, modification, and deletion of files. This requires the

glib API, or the ‘inotify’ API (on GNU/Linux systems only). On

MS-Windows systems, this is supported for Windows XP and newer


Cross platform support. Very good.

The 9th element returned by file-attributes is now unspecified.

Formerly, it was t if the file’s gid would change if file were deleted

and recreated. This value has been inaccurate for years on many

platforms, and nobody seems to have noticed or cared.

The 6th argument to copy-file has been renamed to

PRESERVE-EXTENDED-ATTRIBUTES as it now handles both SELinux context

and ACL entries.

The function file-ownership-preserved-p now has an optional

argument GROUP which causes it check for file group too. This can be

used in place of the 9th element of file-attributes.

The function set-visited-file-modtime now accepts a 0 or -1

argument, with the same interpretation as the returned value of


Changes in autorevert.el

If Emacs is compiled with file notification support, notifications

are used instead of checking the time stamp of the files. You can

disable this by setting the user option auto-revert-use-notify to

nil. Alternatively, a regular expression of directories to be

excluded from file notifications can be specified by


As I’ve talked about at length now, this inotify support is a big thing.

The new user option auto-revert-remote-files enables reversion

of remote files when set to non-nil.

Also useful.

Face changes

The function face-spec-set is now like setq for face specs.

Its third arg now accepts values specifying a face spec type (defface,

custom, or override spec), and the relevant spec is set accordingly.

New function add-face-text-property, which can be used to

conveniently prepend/append new face properties.

Face specs set via Custom themes now replace the defface spec

rather than inheriting from it (as do face specs set via Customize).

New face characteristic (supports :underline (:style wave))

specifies whether or not the terminal can display a wavy line.

New face spec attribute :distant-foreground

specifies foreground to use if background color is near the foreground

color that would otherwise have been used.

Image API

image-animated-p is now image-multi-frame-p.

It returns non-nil for any image that contains multiple frames,

whether or not it specifies a frame delay.

New variable image-default-frame-delay gives the frame delay for

animated images which do not specify a frame delay.

New functions image-current-frame and image-show-frame for getting

and setting the current frame of a multi-frame image.


Namespace cleanup by obsolete-aliasing functions to use eieio- prefix.

object-name -> eieio-object-name

object-class -> eieio-object-class

object-class-fast -> eieio–object-class

object-name-string -> eieio-object-name-string

object-num-slots -> eieio–object-num-slots

object-set-name-string -> eieio-object-set-name-string

class-parent -> eieio-class-parent

class-parents -> eieio-class-parents

class-children -> eieio-class-children

class-num-slots -> eieio–class-num-slots

class-precedence-list -> eieio-class-precedence-list

All generated class-* and object-* field accessors are now

prefixed with eieio- as well.

Obsoleted functions:




Changes in encoding and decoding of text

New coding-system prefer-utf-8.

This is like undecided but prefers UTF-8 on decoding if the text to

be decoded does not contain any invalid UTF-8 sequences. On encoding,

any non-ASCII characters are automatically encoded as UTF-8.

Very very useful. It’s a belt and braces thing; try UTF-8, as that’s probably the right thing, and if that fails leave it undecided. IMO this should be the default setting.

New attributes of coding-systems whose type is undecided.

Two new attributes, :inhibit-null-byte-detection and

:inhibit-iso-escape-detection, determine how to detect encoding of

text that includes null bytes and ISO-2022 escape sequences,

respectively. Each of these attributes can be either nil, zero, or

  1. If it is t, decoding text ignores null bytes and, respectively,

ISO-2022 sequences. If it is nil, null bytes cause text to be decoded

with no-conversion and ISO-2022 sequences cause Emacs to assume the

text is encoded in one of the ISO-2022 encodings, such as

iso-2022-7bit. If the value is zero, Emacs consults the variables

inhibit-null-byte-detection and inhibit-iso-escape-detection, which


The new attribute :prefer-utf-8, if non-nil, causes Emacs to prefer

UTF-8 encoding and decoding, whenever possible.

These attributes are only meaningful for coding-systems of type

undecided. (The type of a coding-system is determined by its

:coding-type attribute and can be accessed by calling the

coding-system-type function.)

time-to-seconds is not obsolete any more.

The lock for ‘DIR/FILE’ is now ‘DIR/.#FILE’ and may be a regular file.

When you edit DIR/FILE, Emacs normally creates a symbolic link

DIR/.#FILE as a lock that warns other instances of Emacs that DIR/FILE

is being edited. Formerly, if there was already a non-symlink file

named DIR/.#FILE, Emacs fell back on the lock names DIR/.#FILE.0

through DIR/.#FILE.9. These fallbacks have been removed, so that

Emacs now no longer locks DIR/FILE in that case.

On file systems that do not support symbolic links, the lock is now a

regular file with contents being what would have been in the symlink.

New functions group-gid and group-real-gid.

Changes to the Emacs Lisp Coding Conventions in Emacs 24.4

The package descriptor and name of global variables, constants,

and functions should be separated by two hyphens if the symbol is not

meant to be used by other packages.

Changes in Emacs 24.4 on Non-Free Operating Systems

The procedure for building Emacs on MS-Windows has changed.

It is now built by running the same configure script as on all other

platforms. This requires the MSYS environment and MinGW development

tools. See the updated instructions in nt/INSTALL for details.

Using the Posix configure script and Makefile’s also means a change in

the directory structure of the Emacs installation on Windows. It is

now the same as on GNU and Unix systems. In particular, the auxiliary

programs, such as cmdproxy.exe and hexl.exe, are in

libexec/emacs/VERSION/i686-pc-mingw32 (where VERSION is the Emacs

version), version-independent site-lisp is in share/emacs/site-lisp,

version-specific Lisp files are in share/emacs/VERSION/lisp and in

share/emacs/VERSION/site-lisp, Info docs are in share/info, and data

files are in share/emacs/VERSION/etc. (Emacs knows about all these

directories and will find the files in there automatically; there’s no

need to set any variables due to this change.)

Emacs on Windows 2000 and later can now access files and directories

whose names cannot be encoded in the current system codepage.

The new variable w32-unicode-filenames controls this feature: if it

is t, Emacs uses Unicode APIs to pass file names to system calls,

which lifts the limitation of file names to the current locale.

The “generate a backtrace on fatal error” feature now works on MS Windows.

The backtrace is written to the ‘emacs_backtrace.txt’ file in the

directory where Emacs was running.

The variable buffer-file-type is no longer supported.

Setting it /codehas no effect, and %t in the mode-line format is ignored.

Likewise, file-name-buffer-file-type-alist is now obsolete, and

modifying it has no effect.

Lock files now work on MS-Windows.

This allows to avoid losing your edits if the same file is being

edited in another Emacs session or by another user. See the node

“Interlocking” in the Emacs User Manual for the details. To disable

file locking, customize create-lockfiles to nil.

Improved fullscreen support on Mac OS X.

Both native (>= OSX 10.7) and “old style” fullscreen are supported.

Customize ns-use-native-fullscreen to change style. For >= 10.7

native is the default.

OSX >= 10.7 can use sRGB colorspace.

Customize ns-use-srgb-colorspace to change style. t is the default.

Note: This does not apply to images.


And there you have it. A lot of changes, most of them are seemingly small changes, but they’re almost all quality-of-life improvements. And I think that’s the only way to really move a product forward: small, incremental improvements.

Is it worth upgrading? That’s up to you. I’m already using the new version; the web browser in particular will be useful for manuals.