Emacs Lisp: fill-region, unfill-region Toggle
Emacs has a command
fill-paragraph 【Alt+q】 that does hard-wrap of current paragraph (it inserts a newline char at every ≈70 chars.)
Emacs also has
fill-region, which acts on a text selection. However, there are some usability problems with these commands. This page discuss the problems and fixes.
One frequently asked question is how to “unfill” — do inverse of
fill-paragraph. Technically, this means replacing newline char by space. Emacs does not have a built-in command for this. The typical answer to this question, is to set the cut-width to a huge number (➢ for example: set fill-column to 10001000), then call
fill-paragraph, then set fill-column back to previous value. This is inconvenient.
If you need to reformat several paragraphs, you need to call
fill-region. There is no keyboard shortcut for it.
Auto Toggle Fill / Unfill / Region
In the following, we suggest a command to automatically toggle “fill” or “unfill” on the current paragraph. If there is a text selection, then the command automatically works on the region.
Here is a implementation:
(defun xah-fill-or-unfill () "Reformat current paragraph or region to `fill-column', like `fill-paragraph' or “unfill”. When there is a text selection, act on the the selection, else, act on a text block separated by blank lines. URL `http://ergoemacs.org/emacs/modernization_fill-paragraph.html' Version 2016-07-13" (interactive) ;; This command symbol has a property “'compact-p”, the possible values are t and nil. This property is used to easily determine whether to compact or uncompact, when this command is called again (let ( (-compact-p (if (eq last-command this-command) (get this-command 'compact-p) (> (- (line-end-position) (line-beginning-position)) fill-column))) (deactivate-mark nil) (-blanks-regex "\n[ \t]*\n") -p1 -p2 ) (if (use-region-p) (progn (setq -p1 (region-beginning)) (setq -p2 (region-end))) (save-excursion (if (re-search-backward -blanks-regex nil "NOERROR") (progn (re-search-forward -blanks-regex) (setq -p1 (point))) (setq -p1 (point))) (if (re-search-forward -blanks-regex nil "NOERROR") (progn (re-search-backward -blanks-regex) (setq -p2 (point))) (setq -p2 (point))))) (if -compact-p (fill-region -p1 -p2) (let ((fill-column most-positive-fixnum )) (fill-region -p1 -p2))) (put this-command 'compact-p (not -compact-p))))
Note: an early implementation is named “compact-uncompact-block”.
Reformat Lines for Source Code
Here's a different implementation that does not call
or, buy something from my keyboard store.