emacs delete-trailing-whitespace кроме текущей строки - PullRequest
7 голосов
/ 20 августа 2010

Я недавно добавил функцию Emacs (delete-trailing-whitespace) в свой 'before-save-hook для некоторых режимов программирования, но я нахожу довольно разочаровывающим, что он удаляет пробелы из строки, которую я сейчас редактирую. Любые предложения относительно того, как решить эту проблему?

Ответы [ 4 ]

10 голосов
/ 20 августа 2010

Поскольку 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.

3 голосов
/ 20 августа 2010

Эта оболочка для 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))))
1 голос
/ 10 ноября 2015

Я столкнулся с той же проблемой и обнаружил, что ws-butler отлично решает ее. Вот простой пример конфигурационного кода:

;; autoload ws-butler on file open
(add-hook 'find-file-hook #'ws-butler-global-mode)
(setq require-final-newline t)
0 голосов
/ 03 марта 2016

У меня просто есть оболочка для двух вызовов `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)
...