Ho recentemente aggiunto la funzione Emacs (delete-trailing-whitespace)
al mio 'before-save-hook
per alcune modalità di programmazione, ma trovo piuttosto frustrante che cancella gli spazi bianchi dalla linea che sto attualmente modificando. Qualche suggerimento su come risolvere questo problema?emacs delete-trailing-spaziatura eccetto la riga corrente
risposta
Da delete-trailing-whitespace
aspetti ambito, una soluzione è quella restringere il buffer alla porzione prima la riga corrente e chiamare, quindi stretta alla porzione dopo la riga corrente e chiamare ancora:
(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))))))
Inserire questa funzione sul before-save-hook
anziché delete-trailing-whitespace
.
Funziona perfettamente, grazie! – pariser
Questo wrapper per delete-trailing-whitespace
può essere usato per fare quello che vuoi:
(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))))
Ho incontrato lo stesso problema, e ha scoperto che ws-butler risolve perfettamente esso. v'è un semplice codice di esempio di configurazione:
;; autoload ws-butler on file open
(add-hook 'find-file-hook #'ws-butler-global-mode)
(setq require-final-newline t)
devo semplicemente un wrapper per effettuare due chiamate a `delete-trailing-white-space ':
(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)
devo dire che non capisco perché si desidera preservare spazi bianchi finali sulla riga corrente. – offby1
La giustificazione: quando sono in fase di modifica di un file, salvo il mio documento è piuttosto compulsivo. Se inizio a digitare "print" e poi salvo il mio buffer, la riga si restringe a "print" e il cursore retrocede, costringendomi a digitare un altro spazio! – pariser