Emacs: fill-region, unfill-region Toggle

By Xah Lee. Date: . Last updated: .

Emacs has a command fill-paragraphAlt+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"
  ;; 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)))
        (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”.

This command is part of ErgoEmacs Keybinding and Emacs: Xah Fly Keys.

Reformat Lines for Source Code

Here's a different implementation that does not call fill-region commands.

Emacs: Reformat Lines for Source Code

Like it? Buy Xah Emacs Tutorial. Thanks.

or, buy something from my keyboard store.