Emacs Delete-Trailing-Whitespace за исключением текущей линии

StackOverflow https://stackoverflow.com/questions/3533703

  •  30-09-2019
  •  | 
  •  

Вопрос

Я недавно добавил 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))))

Я столкнулся с такой же проблемой и узнал, что WS-Butler отлично решает это. Существует простой образец конфигурации кода:

;; autoload ws-butler on file open
(add-hook 'find-file-hook #'ws-butler-global-mode)
(setq require-final-newline t)

У меня просто у меня есть обертка, чтобы сделать два звонка для `Удалить-трейлинг-пробел:

(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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top