你怎么能自动删除VIM中的尾随空白

我正在尝试在git中提交一些文件时出现“拖尾的空白”错误。

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

你可以configurationvim来做到这一点? 如果是这样,怎么样?

我在这里find了答案。

将下面的内容添加到我的.vimrc文件中。

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

汇编上面加上保存光标位置:

 fun! <SID>StripTrailingWhitespaces() let l = line(".") let c = col(".") %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() 

我通常也有一个:

 match Todo /\s\+$/ 

在我的.vimrc文件中,以便行尾空白处于高亮状态。

Todo是一个语法高亮组名 ,用于关键字TODOFIXMEXXX 。 它有一个令人讨厌的丑陋的黄色背景色,我发现这是最好的东西,你不想在你的代码:-)

我既强调了现有的尾随空白,也删除了尾随的空白。

我configuration我的编辑器(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为ruby文件,再次在我的〜/ .vimrc

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

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

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

http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html复制并粘贴(链接不再起作用,但是你需要的位在下面);

“这样做的好处是不会突出显示每行input的空格,只有当您打开文件或离开插入模式时,才会非常整齐。

 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\+$/ 

这就是我正在做的。 我不记得我从哪里偷了它的地方。

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

简单地从文件中删除尾随空白的解决scheme在任何情况下都是不可接受的。 它将在一个从一开始就有了这个策略的项目中工作,所以没有这样的空白,你不只是把你自己添加到即将到来的提交中。

假设你只希望不添加新的尾随空白的实例,而不影响你没有编辑的行中现有的空白,以保证你的提交免于你的工作无关的变化。

在这种情况下,用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中的所有+行,以便在将更改重新应用到工作目录时删除它们的尾部空白。 如果这个命令pipe道是成功的,我们放下存储。

在使用.vimrc文件时,其他方法在某种程度上不适用于MacVim。 所以这是一个能够突出显示尾部空格的方法:

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

我在VIM Wikia的评论中看到了这个解决scheme- 删除不需要的空格

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

在这里输入图像说明

把它放在你的.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() 

autocmd BufWritePre * :%s/\s\+$//<CR>:let @/=''<CR>

对于想为特定文件types运行的人(文件types不总是可靠的):

 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 

如果你修剪空白,你应该在已经干净的文件上做。 “在罗马的时候…”。 在虚假变更不受欢迎的代码库上工作时,这是一个很好的礼仪。

此function检测尾随的空白,只有在已经清洁的情况下才开启修剪。

这个想法的功劳归功于这里的评论: https : //github.com/atom/whitespace/issues/10 (最长的bug票评论stream)

 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