2010-08-20 48 views
7

我最近在某些编程模式中添加了Emacs (delete-trailing-whitespace)函数给我的'before-save-hook,但是我觉得它让人很沮丧,它从我当前正在编辑的行中删除了空格。有关如何解决这个问题的任何建议?emacs delete-trailing-whitespace except current line

+0

我必须说,我不明白为什么你想要保留当前行的尾随空格。 – offby1 2010-08-20 21:15:47

+0

理由:当我在编辑文件的过程中,我强制保存文档。如果我开始输入“print”然后保存我的缓冲区,那么这行会缩小到“打印”并且光标会退出,迫使我输入另一个空格! – pariser 2010-08-21 00:12:11

回答

9

由于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

+0

完美的作品,谢谢! – pariser 2010-08-21 00:09:45

3

此包装为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

我遇到了同样的问题,并且发现了ws-butler完美地解决了它。 有一个简单的示例配置代码:

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

我只是有一个包装,以使两个调用`删除尾随空白“:

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