2010-08-20 5 views
7

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

+0

devo dire che non capisco perché si desidera preservare spazi bianchi finali sulla riga corrente. – offby1

+0

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

risposta

9

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.

+0

Funziona perfettamente, grazie! – pariser

3

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)))) 
1

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) 
0

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)