More batteries included with emacs
Continuing from last time, here are a dozen more tricks Emacs has up its sleeve that it’s shy about telling you. We continue to chip away at Emacs' discoverability problem, one demo at a time.
Same rules as before:
No packages, stock Emacs only
No steep learning curves. Learn each feature in under five minutes or bust. (Up from two minutes last time.)
No gimmicks. No doctor, tetris, snake, dunnet…
Just the deltas. No commonly mentioned packages like flymake, doc-view, outline-minor-mode, gnus or eww. Nothing that Emacs brings up automatically or a nonspecific Google search gets you.
Assume a modern Emacs, 26.3+.
Also, if you’re new to Emacs:
Emacs jargon Modern parlance
Alt + x
Ctrl + x Frame Emacs window Window split/pane Buffer Contiguous chunk of text/data Point Cursor position in buffer Active Region Text selection Region Text selection (not highlighted) Face Font, color and display properties
Okay? Let’s go:
Control Emacs with mouse gestures:
Why are you using Emacs with a mouse, you ask.
In this demo I used gestures to handle window management:
This is because I lack imagination. Consider: You can bind any gesture to any Emacs command.
The real utility of this feature is when you find yourself going back and forth between different interaction paradigms, like a web browser and Emacs, requiring frequent context switching between full keyboard and keyboard/mouse based interaction.
org-roam-insert something from your browser? Want to quickly recompile a TeX document while you’re busy mousing through the corresponding PDF? Need to tweak some markup in your document while you work on graphics in Inkscape? Clone a repository you found online?
The second use case for Strokes is to control Emacs during reading-centric activities, like email or RSS. Star or delete messages, pause or skip music tracks (with some elisp around
playerctl), navigate info nodes, or cycle through Elfeed searches.
M-x strokes-help will get you started. As with most things Emacs, there’s more to the library than meets the eye, like support for multi-part strokes you can use to edit documents in Chinese. The buffer showing the gesture being traced is for demo purposes only, you can customize
(global-set-key (kbd "<down-mouse-3>") 'strokes-do-stroke) ; Draw strokes with RMB (setq strokes-use-strokes-buffer nil) ; Don't draw strokes to the screen
Minibuffer completion styles (
C-h v completion-styles)
The default minibuffer experience is annoying enough to send anyone into the
helm. But Emacs does a lot better in the
tab-completions department than it lets on. The minibuffer can match by
substrings, regexps, initials and even (as of Emacs 27+) fuzzily, and it can do
all of them at once if you don’t mind a giant pile of matches.
You can do worse than
(setq completion-styles '(initials partial-completion flex)) ; > Emacs 27.1 (setq completion-cycle-threshold 10)
M-x ohba tab-expands to
M-x qrr to
query-replace-regexp and so on, allowing you to tab-cycle between up to ten
completions. Use tab to match file names fuzzily and expand short paths
~/.l/sh/g) to long ones (
Stretching the five minute rule a bit: You probably want different matching
rules for different categories, though. Flex matching on extended commands
M-x) can dump hundreds of irrelevant matches on short input, for instance.
You can customize
completion-category-overrides to set the matching style by
the category being completed.
Finally, note that completion styles dictate how a candidate pool is found.
Incremental completion systems like
ido specify how found candidates are
displayed and chosen. These are orthogonal functions, so any set of completion
styles should work with any completion system. Unfortunately this isn’t the
helm are off doing their own thing. Emacs’ built in
completion styles do work with
ido and possibly
Fake Ido (
Improves the other half of the default minibuffer experience: interacting with
selection candidates. Navigating to, from and inside the default completions
buffer takes too many key presses.
ido like selection to
every command in Emacs that uses
completing-read, which is most of them.
ido is also built in, but you know all about it. It also takes some
effort to get ido to work with every command.
fido-mode is set-and-forget, but
it’s Emacs 27+ only.
Easier rectangle editing (
The default rectangle commands in Emacs (
C-x r map) leave a little to be
desired in terms of interactivity. Emacs has fully featured rectangle editing,
but it’s presented in an odd sort of way, as a subfeature of Common User Access.
It’s pretty nifty:
Start or clear a rectangle selection with
C-<return>. Cycle through rectangle
<return>. Yes, you’ll need to rebind it if you use Org or ESS.
It’s a very handy feature, but note that
cua-selection-mode does not mesh
well with undo. If you use
undo-tree, it can lock up trying to undo a
A file explorer and much, much more in Emacs. If you need the Neotree or dired-sidebar package to do anything in Emacs, check out speedbar.
Speedbar pops up a side frame that looks like a file browser, which it is. But
it also integrates with
imenu to show you headings/tags inside files, and with
vc to show you the status of your files:
From inside speedbar you can act on files with (frustratingly, almost dired-like) keybindings. Most regular commands run from speedbar will be run in the associated buffer.
It tracks the active buffer to show you appropriate hierarchical information.
Here I moved point into
Perhaps you’d like a list of your buffers instead. Switch between buffer and
file view with
f. (You can expand a buffer entry for tag/headings.)
Orgtbl minor mode (
Org-mode is its own thing, a full fledged notetaking, publishing, literate-programming, task tracking application with a growing ecosystem that’s parallel to Emacs’.1
But it does provide a handy tool that’s useful in any mode: Making tables. If you’re one of the dozen Emacs users who haven’t hopped on the Org train, this one’s for you.
orgtbl-mode, you can make tables by starting a line with the pipe
character and hitting tab to make a field–like you would in
without getting in the way of your major mode. You can just leave it on and
get on with your work.
Here I table some parameters in matlab-mode as a comment, but even more lazily
than prescribed above by calling
C-c |) on some data.
With some work, you can export the table in place to html or LaTeX, but setting this up would break the five minute rule. You can also use the table as a spreadsheet, which is beyond me.
Regexp builder (
Emacs’ regular expressions syntax can be idiosyncratic if you’re used to PCRE. Are unescaped parens matched literally or do they act as capture groups? Does + need to be escaped to match multiple occurrences of a character? How do I match whitespace again?2
I can never remember. For regularly confused users like me there is
re-builder. Build your regular expressions interactively, one character at a time. Save it to the kill ring for later use. This is a godsend when testing regexes for non-interactive use, like when writing elisp helpers.
A cleaner approach to regular expressions in Emacs, as most package maintainers will tell you, is to use the
rx library instead.
rx translates regular expressions in sexp form to a regexp string:
(rx (and "(" (or "use-package" "require") (+ space) (group (syntax symbol))))
Future history (
M-n in prompts)
M-n cycle through history items in minibuffer prompts. So what happens when you press
M-n when you’re at a blank prompt?
Emacs tries to Do What You Mean. If the cursor is over a file name, for instance,
M-n at the find-file prompt inserts the file path at point into the minibuffer. From the manual:
The “future history” for file names includes several possible alternatives you may find useful, such as the file name or the URL at point in the current buffer. The defaults put into the “future history” in this case are controlled by the functions mentioned in the value of the option file-name-at-point-functions.
Like the DWIM behavior of Emacs commands on regions, many utilities account for
future-history. You can usually drag whatever relevant object point is at into the minibuffer prompt with
Transpose regions (
Lurking in the bevy of transposition commands in Emacs is
which does what it says on the tin3:
Exchange any two non-overlapping regions in a buffer. You’ll need to assign a keybinding though.
(global-set-key (kbd "C-x C-M-t") 'transpose-regions)
Also of note:
transpose-paragraphs, which sounds like a text-mode utility but
works pretty well on adjacent blocks of code.
View mode, again (
View-mode got an airing the last time around but I like it so much I will repeat myself. Turn Emacs into a pager.
By default, pressing
v in dired will open a file in view-mode. You can dismiss
the window and buffer with
q, so regular buffers can essentially function as
info or help buffers do with
View. You can scroll or isearch without pressing
any modifier keys, and all advanced navigation commands (like xref) are still
available, so this is the perfect way to explore a code repository.
AKA I’m not brave enough to use GNUS!
Yes, Emacs has a traditionally styled RSS reader built in. You can organize feeds by folders, peruse with one button, the usual. This is the only feature in this list I no longer use, because Elfeed’s design syncs with my brain much better. That said, Newsticker is excellent for following high volume feeds like subreddits since it doesn’t maintain a database:
You can mark [an item] as “old” when you have read it or – if you want to keep it – you can mark it as “immortal”. You can do that manually and you can define filters which do that automatically, see below. When a headline has vanished from the feed it is automatically marked as “obsolete” unless it has the status “immortal”. “Obsolete” headlines get removed automatically after a certain time.
Another advantage over GNUS is that it needs very little configuration4. I used
it for a while and never read the info page.
newsticker-add-url to add a
source (atom/RSS feed),
newsticker-treeview to browse.
Semantic and Semantic decorators (
Get Emacs to decorate your python code:
Doing this is like pointing a firehose at a matchstick: Semantic is part of CEDET, a large collection of (mostly) built-in tools to try to turn Emacs into a full-fledged IDE. It… doesn’t work great on a code base of serious size or import, but it’s good at analyzing exploratory code/small utilities.
CEDET is written as plumbing, and unless you’re writing a package you probably shouldn’t need to do anything beyond turning on/off minor modes to use it.
Ultimately Semantic is inadequate on account of the XY problem. LSP handles everything it’s supposed to do and does it better, but Semantic is built-in and there if you just want some code-awareness in your Emacs.
This was my attempt at covering built-in features of Emacs I use regularly that
I don’t see being talked about much. There are many more, like
outline-minor-mode that have received a surge of
interest in recent times5. There are also features I know
of that aren’t talked about much, like
tempo. I don’t bring these up since I don’t have any experience with them.
So this concludes my list.
Something entirely different next time: Typing equations in Emacs faster than you can write on paper.
I hear the next major version will make you pancakes. ↩︎
Matched literally, no and “\s-” respectively. ↩︎
Vim users might be familiar with the popular
evil-exchange) plugin that exchanges regions of text. ↩︎
Which doesn’t mean it’s not there. Let’s say I resisted the urge to customize Newsticker because I didn’t want to waste time while I was busy wasting time. ↩︎
Interest from developers and from users. Don’t you love that the distinction is fuzzy in Emacs land? ↩︎