In this short post we’ll review a few features of Emacs that are not well known, but really worth knowing.
The simplest way to repeat a command is to type Control-a number, then the
command. For example if I type
C-6 C-0 ~ (that’s 6 then 0 with the Control
key down, then the tilde character), I get a line with 60 tilde:
Another way is to use the universal argument: we saw how to write an
interactive Lisp function that accepts a numeric argument in the
forward-line is such a function;
it goes down N lines (by default one line). For example
C-u 1 0 DOWN
(Control-u then 1 then 0 then the down arrow key) goes down 10 lines. You can
do the same by calling the function explicitly with
C-u 1 0 M-x forward-line.
Registers are used for saving temporary data in the current session. They can
store positions or bookmarks, text, numbers etc. Registers have a name which is
a letter or a number:
Z (so case-sensitive) and
9, which gives you a total of 62 registers. That’s more than enough.
C-x r is the prefix for all register operations. Generally you type this
prefix, then a key to specify what operation you want (e.g. save or read), then
the register name which is one extra key.
For example, open any file you have in one of your projects, go to some
position in the file, and hit
C-x r SPC a (where
SPC is the space
bar). This command stores the buffer position in register
a. Now go to a
different buffer such as the scratch buffer, and type
C-x r j a: this command
will jump back to the buffer and the position you just stored in register
Note that if you close the file and then retype the same command, Emacs will ask you if you want to reopen the file, and it will bring you back to the same position again. This can be useful if you want to keep bookmarks in a large project, for example if you keep going to the same files and bits within these files, but you don’t want to keep them open all the time.
You can view the content of register
a with command
M-x view-register then
a at the prompt. It will show a window saying that this register stores a
position in your buffer (note that the position is a number, which represents
the offset from the beginning of the buffer). Type
C-x 1, or
q in the other
window, to dismiss it.
A bookmark is similar to a buffer position but with a twist: you give it a name
and it is persisted between Emacs sessions. Note that bookmarks are not
actually associated with registers, but they use the same
C-x r prefix.
The command is
C-x r m (mark) which prompts for a name. By default it
proposes the current buffer name but you can choose whatever you want. You can
view the list of bookmarks with
C-x r l (list). Just click on a bookmark to
jump to it. You can also jump to a bookmark with
C-x r b (bookmark) which
prompts for the name using auto-complete. The nice thing about bookmarks is
that they are saved on the filesystem when you exit Emacs, and they are
available when you restart it. You can also force save with
Sometimes you want to save a snippet of text somewhere, so you can paste it
later. One way is to use the kill ring:
M-w to save the selected text
(which is what Emacs calls the region), then
C-y to paste. The kill ring
saves all copy operations you have done so far, so if you want to paste the
second previous thing you copied, type
C-y followed by
go back in history).
Another way is to save the region in a register, which you do with something
C-x r s a (save in register
a). Now if you want to insert the content
of a register at the current point, type
C-x r i a (insert the content of
This is less useful than the above, but you can also save a window
configuration in a register. For example, split the screen horizontally with
C-x 2, then split the current window vertically with
C-x 3. You now have 3
windows displayed, which you can resize as you see fit.
Let’s save this layout in register
C-r w a. Now dismiss all other
windows than the current one using
C-x 1. If you want to restore the layout,
C-r j a (it is the same key for jumping to a buffer position). Note that
this only saves window configurations and not buffers content: if you close one
of the buffers Emacs will not reopen it for you.
The table below summarizes the keys we just learned.
||Store the current position to register
||Jump to the position stored in register
or restore the window positions stored in register
||Save the selected region in register
||Insert the text saved into register
||Save window positions in register
||Save a bookmark.|
||Go to a bookmark.|
Editing macros are a very powerful feature of Emacs. After all, Emacs stands for “Editing Macros” 1.
There are several keys for macros, but really you only need to remember two of
F4. The first one records a new macro. The second one
terminates the recording, if you were recording a macro; otherwise it executes
the macro. If you make an mistake while recording a macro, hit
C-g to abort,
and start over.
Let’s take an example. Suppose I have this text:
Now suppose I want to make each line start with a capital letter and end with a period. I could edit the text manually because it is only 3 lines, but just imagine that it is much longer for argument’s sake, in order to make the use of a macro more compelling.
The way to do this with a macro is simple: fix the first line, while recording a macro. Then execute the macro N times, one time per remaining line. To record the macro do the following:
- Move the cursor to the beginning (e.g.
F3to start recording.
M-cto capitalize the first word (
C-eto go to the end of the line.
.to insert a period. Now the first line is good.
C-ato go to the beginning of the line (where we started), and the down arrow to go to the next line.
F4 to stop recording. Then
F4 again to run the macro on the second
F4 again to run the macro on the 3rd line. You’re done!
You could also run the macro N times using Control-a number then
F4, as we
saw earlier. You can also apply the macro to a whole region by selecting the
region and running
M-x apply-macro-to-region-lines, which is neat.
If you want to see macros at their best (and incidentally Emacs beat Vim at its own game), check out this quick video:
The entire series of Emacs Rocks is worth watching.
That’s it for today. Lots more to come. Stay tuned!
Note that Emacs editing macros have nothing to do with Lisp macros: one is a trick to save a sequence of keys and repeat it, the other is a Lisp function that executes twice, at compilation time and at run time. ↩