Removing blank lines in a buffer
This is a frequent question so I figured I’d mention the solution here:
You want to remove all empty (blank) lines from a buffer. How do you do it? Well, it’s super easy.
Mark what you want to change (or use
C-x h to mark the whole buffer) and run this:
M-x flush-lines RET ^$ RET
And you’re done. So what does that mean? Well,
M-x flush-lines will flush (remove) lines that match a regular expression, and
^$ contain the meta-characters
^ for beginning of string and
$ for end of string. Ergo, if the two meta-characters are next to eachother, it must be a blank line.
We can also generalize it further and remove lines that may have whitespace (only!) characters:
M-x flush-lines RET ^\s-*$ RET
In this case
\s- is the syntax class (type
C-h s to see your buffer’s syntax table) for whitespace characters. The
* meta-character, in case you are not a regexp person, means zero or more of the preceding character.
Update — Pete Wilson asks: “How do you collapse multiple lines into one blank line?”.
That’s a bit harder, mostly because
flush-lines only works well on whole, single lines. For multi-line processing you have two choices: you can abuse regexp, or you can use a macro. It’s fairly easy to do it with regexp in this case, but for more complex data-scrubbing I would use a macro; nevertheless, I will do it both ways*.
*I’m pretty sure my macro/regexp examples are general enough to work in all cases; but let me know if they aren’t
For the regexp approach I will use
query-replace-regexp) and because I have to use a literal newline character I will use Emacs’s
quoted-insert command, bound to
C-q. So to insert a newline, you would type
^J represents the literal newline or line feed character (see ASCII Control Characters on Wikipedia for more information).
So the text we want to search for looks like this:
So how does it work? Well, we tell Emacs to search for any two or more newlines that are at the beginning of a string — where each line is considered a string by Emacs — and because we search for two or more we skip the ones that only have a single newline. So if there are 10 newlines in a row, we replace them all in one fell swoop with a single newline. You can omit the replacement newline to remove them altogether!
The other way is very similar and uses a keyboard macro,
delete-blank-lines bound to
C-x C-o. This approach is more complicated than it really ought to be, because
delete-blank-lines will annoyingly (in this case — it’s a useful feature otherwise!) convert multiple blank lines into a single blank line (good), and remove single blank lines altogether (bad.)
To make the macro, go to the end of the buffer
F3 to begin recording, and then type
C-M-r and in the isearch prompt enter:
Regexp ISearch backward:
Press return to go to the first match and press
C-x C-o. Now press
F4 to stop recording and you’re done with the macro. Press
C-u C-x e to fix all remaining instances, and that’s it — you’re done.
Exercise to the reader: Why did I search in reverse with
C-M-r instead of using