Emacs: Reformat Lines (Hard-Wrap lines, fill) πŸš€

By Xah Lee. Date: . Last updated: .

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 Alt + x fill-paragraph, then set fill-column back to previous value. This is inconvenient.

If you need to reformat several paragraphs, Alt + x fill-region. There is no keyboard shortcut.

Auto Toggle Fill/Unfill/Region

This command automatically toggle β€œfill” or β€œunfill” on the current paragraph. If there is a text selection, then the command automatically works on the region.

(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 selection, else, act on a text block separated by blank lines.
URL `http://xahlee.info/emacs/emacs/modernization_fill-paragraph.html'
Version 2017-01-08"
  ;; 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 use emacs's fill-region commands. This is useful if you want to use it on programing language source code.

Emacs: Reformat Lines for Source Code πŸš€

Line Wrap

Emacs Modernization