在Git中提交一些文件时,我得到了“尾随空白”错误。

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

您可以配置Vim来实现这一点吗?如果有,怎么做?


当前回答

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

function! <SID>StripTrailingWhitespaces()
  if !&binary && &filetype != 'diff'
    let l:save = winsaveview()
    keeppatterns %s/\s\+$//e
    call winrestview(l:save)
  endif
endfun

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

如果你想在保存到任何文件时应用此命令,请省略第二个autocmd并使用通配符*:

autocmd BufWritePre,FileWritePre,FileAppendPre,FilterWritePre *
  \ :call <SID>StripTrailingWhitespaces()

其他回答

对于那些想要为特定的文件类型(FileTypes并不总是可靠的)运行它的人:

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

简单地从文件中去除尾随空格的解决方案在所有情况下都是不可接受的。它将在从一开始就具有此策略的项目中工作,因此在即将提交的提交中没有这样的空白。

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

在这种情况下,使用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中的所有+行,以在我们重新将更改应用到工作目录时删除它们的尾随空格。如果这个命令管道成功,我们就丢弃隐藏。

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

function! <SID>StripTrailingWhitespaces()
  if !&binary && &filetype != 'diff'
    let l:save = winsaveview()
    keeppatterns %s/\s\+$//e
    call winrestview(l:save)
  endif
endfun

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

如果你想在保存到任何文件时应用此命令,请省略第二个autocmd并使用通配符*:

autocmd BufWritePre,FileWritePre,FileAppendPre,FilterWritePre *
  \ :call <SID>StripTrailingWhitespaces()

在.vimrc文件中使用时,这里的其他方法在MacVim中不知何故对我不起作用。这里有一个这样的例子,它突出显示了尾随空格:

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

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