5

There is an unfill-paragraph mentioned here that does the opposite of fill-paragraph. I would like to bind the key like the follows. M-q once to fill-paragraph. If the cursor does not move, push M-q again to unfill-paragraph. What is an elegant way to implement this in Emacs?

5

The answer provided by @icarus does not let you keep toggling back and forth. If you want that then you also need to set this-command, so that it alternates.

(defun my-fill-paragraph (&optional arg)
  "Fill or unfill paragraph.  If repeated, alternate.
A prefix arg for filling means justify (as for `fill-paragraph')."
  (interactive "P")
  (let ((fillp  (not (eq last-command 'fill-paragraph))))
    (apply (setq this-command  (if fillp 'fill-paragraph 'unfill-paragraph))
           (and fillp  arg  '(full t)))))
| improve this answer | |
  • 1
    Using "icarus's answer" rather than "the answer of @icarus" stops stack exchange from notifying me. In general I dislike updating this-command, although it works in this case. It stops you being able to use my-fill-paragraph as a function to call from some other toggle. You should refactor the body to be (interactive)(funcall (setq this-command (if (eq last-command #'fill-paragraph) #'unfill-paragraph #'fill-paragraph))). I look forward to you adding the support for prefix arg to be passed on to fill-paragraph. – icarus Dec 31 '16 at 6:18
  • @icarus: (I didn't know about "@icarus's".) Edited as suggested (except using a symbol, not a function object, for this-command value). HTH. – Drew Dec 31 '16 at 17:30
3

Something like

(defun xuhdev/fill-paragraph ()
  (interactive)
  (if (eq last-command this-command)
      (unfill-paragraph)
    (fill-paragraph)))

and then binding xuhdev/fill-paragraph to M-q perhaps? I can't say I am a great fan of the idea, and I am leaving off support for arguments to fill-paragraph...

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.