I figured I’d write a blog post about the keys I’ve bound but also rebound in Emacs. I think rebinding keys in Emacs — even though, in essence, the editor is built around the idea of customization — is a perilous thing to do if you are not careful: people do it without knowing why the key is bound to what it is. This is particularly true of the “core” bindings in Emacs. Rebinding keys is something you should do as a last resort: if you’re new to Emacs and your first impulse is to rebind everything — stop! Learn Emacs first and then decide.
C-f. It moves forward by the character, but
M-f moves forward by word, and
C-M-f moves forward by an s-expression. See the similarities? The
C- for character,
M- for word and
C-M- for s-exp is a recurring pattern in Emacs.
Having said that… there are keys I rebind and commands I explicitly bind to keys. Most of them are quality of life improvements: I want to make it easier to type things I do frequently.
|New Binding||Reason for Rebinding|
||This I bind to a custom Helm command that calls up some of my more frequent things. This key is surprisingly unbound in most modes.|
||This is taken from my article on fixing the mark commands. When pressed it’ll jump around in the mark ring. Very useful, but Ubuntu and Unity (in their wisdom) have decided that I am not allowed to rebind this key…. so I cannot use it any more.|
||I kill buffers all the time, and the idea of killing a buffer that is not active is just not part of my workflow at all. This key will kill the active buffer without any prompting whatsoever.
||I bind this to the command
||This I bind to CSSH’s
||By default this will run
||I bind these to my smart scan next/previous commands. They’re part of my Smart Scan package.|
||This runs my own command,
||This calls another custom command of mine,
||This is simply bound to
And that’s pretty much it. Not a whole lot, really. I do repurpose quite a few of the aforementioned keys as there is, to me, a lot of useless cruft I’d never use, but apart from that very few of them are remapped.
Still, there’s always room for improvement. If you have any suggestions or handy snippets — post below or e-mail me.
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
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-infohas been generalized,
and renamed to
--without-compress-install. It now prevents compression
of _any_ files during installation.
The configure option
--with-crt-dirhas been removed.
It is no longer needed, as the crt*.o files are no longer linked
Directories passed to configure option
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
zlib-decompress-regionbecomes 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
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
;on MS Windows;
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-paththat these files make
will no longer be present after dumping. To affect a permanent change
load-path, use the
The user option
initial-buffer-choicecan 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
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
If you want the previous behavior, whereby F10 invoked
customize the option
tty-menu-open-use-tmmto a non-nil value.
will always invoke
tmm-menubar, even if
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
a new major mode, with read-only status. Any code that might create
the *Messages* buffer should call the function
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.
set-file-aclget 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.
frame-monitor-attributescan 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.
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
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
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.
apropos-variableis renamed to
apropos-user-optionshows all user options while
shows all variables. When called with a universal prefix argument,
the two commands swap their behaviors. When
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.
?now describes prefix bindings, like
Excellent. I can't think of any prefix bindings that uses
quail-helpis deleted. Use
Frame and window changes
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.
frameset-to-registeris 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
frame-configuration-to-registerstill 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.
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-windowis now a non-interactive function, not a command.
As a command, it was a special case of
and as such superfluous. After being reimplemented in Lisp, its
interactive form was mistakenly retained.
Unlikely that too many people call this command directly.
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-defunon an already defined defcustom calls the :set function,
if there is one.
A zero prefix arg of
a list with no limit on its length and level (by using nil values of
print-level), and inserts additional formats for
integers (octal, hexadecimal, and character).
That's very handy!
write-region-inhibit-fsyncnow 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-scanshas been renamed to
because it affects caching of paragraph scanning results as well.
set-mark-default-inactivehas 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-stateis changed to t,
and this variable has been marked obsolete.
New user options
read-regexp-defaults-functiondefines a function to read regexps,
used by commands like
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
loadfunction 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
The behavior of
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-modeis 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
tab-stop-listis now implicitly extended to infinity by repeating
the last step. Its default value is changed to nil which means a tab
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.
cycle-spacingcycles between spacing conventions:
having just one space, no spaces, or reverting to the original
just-one-space, it can handle or ignore newlines and
leave different number of spaces.
Useful function, but between
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-pprevents 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
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?
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
All register commands can now show help with preview.
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.
C-x r f(
See Changes in Emacs 24.4, above.
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>.
~/.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
ecommand 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.
debugger-toggle-locals) displays local vars.
A sorely missed feature of most debuggers finally arrives in Emacs.
New minor mode
jit-lock-debug-modelets you use the debuggers on
code run via JIT Lock.
Battery information via the BSD
apmutility is now supported.
M-s a C-oshows lines matching a regexp in marked buffers using Occur.
Calendar and Diary
diary-from-outlook-function, used by the command
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-switchlets 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
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++.
letf is now just an alias for cl-letf.
CUA mode now uses
Hence, you can now enable it independently from
cua-highlight-region-shift-onlyis now obsolete.
You can disable
transient-mark-modeto get the same result.
CUA's rectangles can now be used via
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.
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
desktop-auto-save-timeoutdefines 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-forces-onscreenoffer 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
For when details must be obscured.
Eldoc Mode works properly in the minibuffer.
Electric Pair mode
electric-pair-preserve-balanceenabled 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
Hopefully this works "as intended" without creating more headaches than it tries to cure.
electric-pair-delete-adjacent-pairsenabled by default.
electric-pair-mode, the commands
backward-delete-char-untabifyare 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.
electric-pair-open-newline-between-pairsenabled by default.
electric-pair-mode, inserting a newline between adjacent pairs
opens an extra newline after point, which is indented if
electric-indent-modeis 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.
electric-pair-skip-whitespaceenabled by default.
Controls if skipping over closing delimiters should jump over any
whitespace slack. Setting it to
chompmakes it delete this
whitespace. See also the variable
New variables control the pairing in strings and comments.
You can customize
electric-pair-text-syntax-tableto tweak pairing behaviour inside
strings and comments.
You can set this to a list of alias expansions for keys to use
If one element of the variable's value is ("email@example.com" "firstname.lastname@example.org"),
that means: when one of the recipients of the message being encrypted
email@example.com, encrypt the message for
If one element of the variable's value is ("firstname.lastname@example.org"),
that means: when one of the recipients of the message being encrypted
email@example.com, ignore that name as regards encryption.
This is useful to avoid a query when you have no key for that name.
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.
skip-unlessallows skipping ERT tests.
See the ERT manual for details.
eshellnow 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
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
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
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.
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.
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-bufferstakes a new value 'auto.
ido-decorationshas been slightly extended to give a bit more control.
visit the next image file and the previous image file in the same
And with one fell swoop Emacs becomes a much better image browser.
New commands to show specific frames of multi-frame images.
image-previous-frame) visit the
next or previous frame.
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.
image-mode-fit-framedeletes 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.
hi-lock-auto-select-face. When non-nil, hi-lock commands
will cycle through faces in
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 .(
highlights the symbol found near point without prompting,
using the next face automatically.
Avoids false positives from having function/method definitions in comments or strings.
info-index-matchis used to highlight matches in index
entries displayed by
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
MH-E has been updated to MH-E version 8.5.
See MH-E-NEWS for details.
Font locking for texinfo comments and new keywords
Completion in Octave file buffers
Jump to definition
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-indentsis not supported any more.
delphi-tabis gone, replaced by
The format of
archive-contentsfiles, generated by package
repositories, has changed to allow a new (fifth) element in the data
vectors, containing an associative list with extra properties.
describe-packagebuffer uses the
:urlextra property to
Homepageheader, if it's present.
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,
for the Package->Filter menu filters
the packages by a keyword.
prolog-use-smiehas been removed, along with the non-SMIE
The new command
remember-notescreates a buffer which is saved
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
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
for new options related to this function.
rmail-mbox-formatto influence some minor aspects of
how Rmail displays non-MIME messages.
unrmailcommand now converts from BABYL to mboxrd format,
rather than mboxo. Customize
unrmail-mbox-formatto change this.
New mode menu.
Improved syntax highlighting and indentation.
Add more Ruby file types to
Search and Replace
New global command
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 RETin 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 iin Isearch mode toggles the variable
between nil and the value of the option
when it's nil).
query-replaceskips invisible text when
and opens overlays with hidden text when
A negative prefix arg of replacement commands replaces backward.
M-- M-%replaces a string backward,
M-- C-M-%replaces a regexp
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.
isearch-allow-prefixto nil to restore old behavior.
More Isearch commands accept prefix arguments, namely
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
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.
ses-rename-cellallows assigning names to SES cells.
explicit-bash-argsnow 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-modenow has the mode own
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
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.
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
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,
set-file-aclfor remote machines
which support POSIX ACLs.
Impressive that ACL support also works for remote files.
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.
VC and related modes
In VC directory mode,
Ddisplays diffs between VC-controlled
whole tree revisions.
In VC directory mode,
Llists the change log for the current VC
controlled tree in a window.
In VC directory mode,
Ishows 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-ignorehas been renamed to
because it is moved to vc-cvs.el.
are obsolete. Customize the
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
ewwis 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-modeoverrides the default word motion commands to treat
symbol_words as a single word, similar to what
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
- advice-add/advice-remove to add/remove a piece of advice on a named function,
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
(input-pending-p)no longer runs other timers which are ready to
run. The new optional CHECK-TIMERS param allows for the prior behavior.
defcustomin 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.
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
A sane default for most of us, I think.
overriding-terminal-local-mapno 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-eventdoes 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-eventany more. But unlike in Emacs 22, this decoding is still
done before input-decode-map, function-key-map, etc.
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-functiondoes not signal a
void-functionerror any more.
To determine if a symbol's function definition is void, use
defadvicedoes not honor the
freezeflag and cannot advise
special-forms any more.
dolistno 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
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
visited-file-modtimenow 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
treated as regexps rather than literal strings.
Lisp Changes in Emacs 24.4
The second argument of
evalcan 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 ?
define-alternativescan 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.
defalias-fset-functionproperty lets you catch
calls, and redirect them to your own function, instead of
Docstrings can be made dynamic by adding a
text-property on the first char.
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.
The separator for
completing-read-multiplecan now be a regexp.
The default separator has been changed to allow surrounding spaces
around the comma.
completion-all-completions, which returns highlighted
strings (including for partial or substring completion), or call
completion-hilit-commonalityto add the highlight.
Functions to pop up menus and dialogs now work on all terminals,
including TTYs. This includes
display-popup-menus-pwill now return non-nil for a
display or frame whenever a mouse is supported on that display or
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.
No idea what?
with-demoted-errorstakes an additional argument
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.
with-wrapper-hookis obsoleted by
The few hooks that used with-wrapper-hook are replaced as follows:
byte-compile-interactive-only-functionsis now obsolete.
It has been replaced by the symbol property ‘interactive-only.
split-stringnow 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
Support for filesystem notifications.
Emacs now supports notifications of filesystem changes, such as
creation, modification, and deletion of files. This requires the
glibAPI, 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-attributesis 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-filehas been renamed to
PRESERVE-EXTENDED-ATTRIBUTES as it now handles both SELinux context
and ACL entries.
file-ownership-preserved-pnow has an optional
argument GROUP which causes it check for file group too. This can be
used in place of the 9th element of
set-visited-file-modtimenow 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
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
of remote files when set to non-nil.
face-spec-setis now like
setqfor 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.
add-face-text-property, which can be used to
conveniently prepend/append new face properties.
Face specs set via Custom themes now replace the
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.
It returns non-nil for any image that contains multiple frames,
whether or not it specifies a frame delay.
image-default-frame-delaygives the frame delay for
animated images which do not specify a frame delay.
and setting the current frame of a multi-frame image.
Namespace cleanup by obsolete-aliasing functions to use
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
Changes in encoding and decoding of text
This is like
undecidedbut 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
Two new attributes,
: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
t. 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-typeattribute and can be accessed by calling the
time-to-secondsis 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.
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-filenamescontrols 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.
buffer-file-typeis no longer supported.
Setting it /codehas no effect, and %t in the mode-line format is ignored.
file-name-buffer-file-type-alistis 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
Improved fullscreen support on Mac OS X.
Both native (>= OSX 10.7) and “old style” fullscreen are supported.
ns-use-native-fullscreento change style. For >= 10.7
native is the default.
OSX >= 10.7 can use sRGB colorspace.
ns-use-srgb-colorspaceto 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.