Thats what I'm using, not specific go any mode. Honors region if existing: (defun just-one-empty-line (&optional beg end) "Delete consecutive empty lines, retain just one." (interactive "*") (let ((beg (cond (beg) ((region-active-p) (region-beginning)) (t (point-min)))) (end (cond (end (copy-marker end)) ((region-active-p) (copy-marker (region-end))) (t (copy-marker (point-max)))))) (save-excursion (save-restriction (narrow-to-region beg end) (goto-char beg) (while (not (eobp)) (while (looking-at "^\\([ \t]*\n\\)[ \t]*$") (delete-region (match-beginning 1) (match-end 1))) (forward-line 1)) (widen)))))