emacs delete-trailing-whitespace except current line
Asked Answered
I

4

9

I recently added Emacs (delete-trailing-whitespace) function to my 'before-save-hook for some programming modes, but I find it rather frustrating that it deletes whitespace from the line I am currently editing. Any suggestions as to how to fix this problem?

Ironmaster answered 20/8, 2010 at 18:19 Comment(2)
I must say I don't understand why you want to preserve trailing whitespace on the current line.Anglin
The justification: when I'm in the middle of editing a file, I save my document rather compulsively. If I start typing "print " and then save my buffer, the line shrinks to "print" and the cursor recedes, forcing me to type another space!Ironmaster
P
11

Since delete-trailing-whitespace respects narrowing, one solution is to narrow the buffer to the portion before the current line and call it, then narrow to the portion after the current line and call it again:

(defun delete-trailing-whitespace-except-current-line ()
  (interactive)
  (let ((begin (line-beginning-position))
        (end (line-end-position)))
    (save-excursion
      (when (< (point-min) begin)
        (save-restriction
          (narrow-to-region (point-min) (1- begin))
          (delete-trailing-whitespace)))
      (when (> (point-max) end)
        (save-restriction
          (narrow-to-region (1+ end) (point-max))
          (delete-trailing-whitespace))))))

Put this function on your before-save-hook instead of delete-trailing-whitespace.

Prepay answered 20/8, 2010 at 18:34 Comment(0)
B
4

This wrapper for delete-trailing-whitespace can be used to do what you want:

(defun delete-trailing-whitespace-except-current-line ()
  "do delete-trailing-whitespace, except preserve whitespace of current line"
  (interactive)
  (let ((current-line (buffer-substring (line-beginning-position) (line-end-position)))
        (backward (- (line-end-position) (point))))
    (delete-trailing-whitespace)
    (when (not (string-equal (buffer-substring (line-beginning-position) (line-end-position))
                             current-line))
      (delete-region (line-beginning-position) (line-end-position))
      (insert current-line)
      (backward-char backward))))
Biometry answered 20/8, 2010 at 18:49 Comment(0)
N
1

I ran into the same problem, and found out that ws-butler perfectly solves it. There is a simple sample config code:

;; autoload ws-butler on file open
(add-hook 'find-file-hook #'ws-butler-global-mode)
(setq require-final-newline t)
Novikoff answered 10/11, 2015 at 3:57 Comment(0)
T
1

I simply have a wrapper to make two calls to `delete-trailing-whitespace':

(defun modi/delete-trailing-whitespace-buffer ()
  "Delete trailing whitespace in the whole buffer, except on the current line.
The current line exception is because we do want to remove any whitespace
on the current line on saving the file (`before-save-hook') while we are
in-between typing something.

Do not do anything if `do-not-delete-trailing-whitespace' is non-nil."
  (interactive)
  (when (not (bound-and-true-p do-not-delete-trailing-whitespace))
    (delete-trailing-whitespace (point-min) (line-beginning-position))
    (delete-trailing-whitespace (line-end-position) (point-max))))
(add-hook 'before-save-hook #'modi/delete-trailing-whitespace-buffer)
Tanjatanjore answered 3/3, 2016 at 19:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.