如何自动删除vim中的尾随空格


197

我在尝试在git中提交某些文件时遇到“尾随空白”错误。

我想在保存python文件之前自动删除这些结尾的空格字符。

您可以配置vim来做到这一点吗?如果是这样,怎么办?


3
这不仅仅与python有关


Answers:


208

我在这里找到了答案。

将以下内容添加到我的.vimrc文件即可达到目的。

autocmd BufWritePre *.py :%s/\s\+$//e

1
有趣!尾随空白是工作之战。我讨厌它,其他人不明白为什么。我们使用和vim一样多的vi(我使用vim;他们之所以没有,是因为他们必须安装它)。我有一个程序叫stb来剥离尾随空白,并将其用作过滤器。也可以在vi中使用。这个更好。
乔纳森·莱夫勒

16
这会在每次保存时更改光标位置。有可能避免吗?
stepancheg

3
由于这是该问题的实际答案,因此可能应对其进行更新以保持光标位置。
Edu Felipe

2
这也将删除多行字符串中的尾随空格,这在某些情况下可能是不希望的。但是我想没有简单的方法可以避免这种情况吗?
luator

3
也许您可以明确地指出e,最后的意思是,如果我们找不到模式,vi不会将替代命令视为失败
LLenain

169

以上编译加上保存光标位置:

fun! <SID>StripTrailingWhitespaces()
    let l = line(".")
    let c = col(".")
    keepp %s/\s\+$//e
    call cursor(l, c)
endfun

autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()

如果要将其应用于保存到任何文件,请省略第二个文件autocmd并使用通配符*

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()

9
您还可以保存上一次搜索并还原它,从而改善功能。let _s = @ / let @ / = _ s
xApple 2011年

3
我删除了该autocmd FileType c,cpp,java,php,ruby,python 部分以使其适用于所有文件。
swt83

8
@xApple:在函数内部,无需保存和恢复上一次搜索-保留函数上下文即可解决此问题。
Tobias

3
如果您希望它在所有文件上都工作<buffer>*则还需要替换为@ swt83
cadlac

3
如果在替代命令w / keeppkeepp %s/\s\+$//e
前面加上

68

我通常也有:

match Todo /\s\+$/

在我的.vimrc文件中,使行尾空格突出显示。

藤堂是一个语法高亮显示组名称是用于高亮显示了类似的关键字TODOFIXMEXXX。它具有令人讨厌的淡黄色背景色,我发现最好在代码中突出显示您不需要的内容 :-)


7
或者,您可以设置列表并设置listchars + = trail:。
奥利

出色-在自动删除结尾的空格(即使我可能不知道它,或者当我正巧在同一文件中使用的其他人的代码)到不做任何事情之间,这是完美的中间立场。谢谢。
Daniel Hershcovich 2011年

2
不幸的是,我最喜欢的颜色方案zenburn好好尝试一下亮点
彼得龙

@PeterLong,也不适用于railscasts主题。用检查:hi Todo。所以,我仔细阅读:hi <Tab>:help hi。我认为CursorError,但我想我会尝试match VisualNOS /\s\+$/ 。我可以将其与autocmd此处其他答案中的s 结合使用。
Brady Trainor 2014年

51

我既突出显示了现有的尾随空白,也删除了尾随空白。

我将编辑器(vim)配置为最后显示空白,例如

在此处输入图片说明

在我的.vimrc的底部:

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

并且在保存文件时将其从文件中“自动剥离”,在我的情况下,*。rb用于红宝石文件,再次在我的〜/ .vimrc中

function! TrimWhiteSpace()
    %s/\s\+$//e
endfunction
autocmd BufWritePre     *.rb :call TrimWhiteSpace()

13

这是一种按多个FileType进行过滤的方法。

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e

每个文件:autocmd FileType * autocmd BufWritePre <buffer>:%s / \ s \ + $ // e
JREAM

7

http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html复制并粘贴(该链接不再有效,但您需要的内容如下)

“这样做的好处是,只有在打开文件或退出插入模式时,才突出显示您在行尾键入的每个空格。非常整洁。”

highlight ExtraWhitespace ctermbg=red guibg=red
au ColorScheme * highlight ExtraWhitespace guibg=red
au BufEnter * match ExtraWhitespace /\s\+$/
au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
au InsertLeave * match ExtraWhiteSpace /\s\+$/

1
博客链接似乎已消失。
Tobias

此链接的 “使用match命令”下可以找到相同的解决方案。
ryanjdillon

6

我在VIM Wikia的评论中看到了此解决方案 -删除不需要的空格

我真的很喜欢它。.在不需要的空格上添加一个。

在此处输入图片说明

把这个放在你的 .vimrc

" Removes trailing spaces
function TrimWhiteSpace()
  %s/\s*$//
  ''
endfunction

set list listchars=trail:.,extends:>
autocmd FileWritePre * call TrimWhiteSpace()
autocmd FileAppendPre * call TrimWhiteSpace()
autocmd FilterWritePre * call TrimWhiteSpace()
autocmd BufWritePre * call TrimWhiteSpace()

5

这就是我的做法。我不记得我是从哪里偷来的。

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun

2
哼,如果最终打开二进制文件,在“ *”上执行此操作非常危险,它们可能会变成非常糟糕的形状。

是的,可能不是最聪明的,然后我也不再将vim用于十六进制编辑器。除非您保存,否则将不会执行。
gregf

我认为这优于列出您可能会处理的每个文件类型的替代方法,对吗?我在rb,php,cs,html,sass,css,js,coffee,xml,xslt,pl等等等上工作……是否有一个快乐的媒介?
德里克(Derek),

4
除非您在vim中写入二进制文件,否则这可能永远不会成为问题。
gregf

第一次出现时,%s全局(g)标志与EOL中的空格一样无用:-)
Jens

3

在所有情况下都不能接受仅从文件中删除尾随空格的解决方案。它将在从一开始就具有此策略的项目中工作,因此没有空白,您不只是将自己添加到即将到来的提交中。

假设您只希望不添加尾随空格的新实例,而不影响未编辑行中的现有空格,以使提交的内容不受与工作无关的更改的影响。

在这种情况下,使用git可以使用如下脚本:

#!/bin/sh

set -e # bail on errors

git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop

也就是说,我们将更改存储起来,然后+在将更改重新应用到工作目录时过滤diff中的所有行以删除其尾随空格。如果此命令管道成功,则将隐藏存储。


1

.vimrc文件中使用MacVim时,这里的其他方法对我不起作用。所以这是一个突出显示尾随空格的代码:

set encoding=utf-8
set listchars=trail:·
set list

执行set listchars=trail:·话说:E474: Invalid argument: listchars=trail:·。您可以验证您的示例吗?
kenorb



0

对于想要针对特定​​文件类型运行它的人(FileType并不总是可靠的):

autocmd BufWritePre *.c,*.cpp,*.cc,*.h,*.hpp,*.py,*.m,*.mm :%s/\s\+$//e

或与vim7:

autocmd BufWritePre *.{c,cpp,cc,h,hpp,py,m,mm} :%s/\s\+$//e

0

如果修剪空白,则只应在已经干净的文件上进行。“在罗马的时候...”。在不受欢迎的情况下使用代码库时,这是一种很好的礼节。

此功能可检测到尾随空白,并仅在已清除的情况下才打开修剪。

这个想法的功劳归功于这里的评论瑰宝:https : //github.com/atom/whitespace/issues/10 (有史以来最长的错误票证评论流)

autocmd BufNewFile,BufRead *.test call KarlDetectWhitespace()

fun! KarlDetectWhitespace()
python << endpython
import vim
nr_unclean = 0
for line in vim.current.buffer:
    if line.rstrip() != line:
        nr_unclean += 1

print "Unclean Lines: %d" % nr_unclean
print "Name: %s" % vim.current.buffer.name
cmd = "autocmd BufWritePre <buffer> call KarlStripTrailingWhitespace()"
if nr_unclean == 0:
    print "Enabling Whitespace Trimming on Save"
    vim.command(cmd)
else:
    print "Whitespace Trimming Disabled"
endpython
endfun

fun! KarlStripTrailingWhitespace()
    let l = line(".")
    let c = col(".")
    %s/\s\+$//e
    call cursor(l, c)
endfun

您还可以保留搜索寄存器let _s=@/并将其恢复到`let @ / = _ s'结尾。在这种情况下,我们使用黑洞寄存器
SergioAraujo,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.