Недавно я добавил функцию Emacs (delete-trailing-whitespace)
в мой 'before-save-hook
для некоторых режимов программирования, но я нахожу довольно расстраивающим, что он удаляет пробелы из строки, которую я сейчас редактирую. Есть предложения, как решить эту проблему?
Поскольку delete-trailing-whitespace
учитывает сужение, одно из решений - сузить буфер до части перед текущей строкой и вызвать ее, затем сузьте до части после текущей строки и вызовите ее снова:
(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))))))
Поместите эту функцию в свой before-save-hook
вместо delete-trailing-whitespace
].
Эта обертка для delete-trailing-whitespace
может быть использована для того, что вы хотите:
(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))))