211

我在尝试在 Git 中提交一些文件时遇到“尾随空格”错误。

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

你能配置 Vim 来做到这一点吗?如果是这样,怎么做?

4

14 回答 14

217

我在这里找到了答案。

将以下内容添加到我的 .vimrc 文件中就可以了:

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

最后的e标志意味着如果搜索模式失败,该命令不会发出错误消息。查看:h :s_flags更多。

于 2008-12-10T14:03:53.387 回答
178

上面的编译加上保存光标位置:

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()
于 2009-10-24T16:10:50.663 回答
70

我通常也有一个:

match Todo /\s\+$/

在我的.vimrc文件中,因此行尾空白被突出显示。

Todo 是一种语法高亮组名,用于高亮关键字,如TODO,FIXMEXXX. 它有一个令人讨厌的难看的淡黄色背景颜色,我发现最好在代码中突出显示你想要的东西:-)

于 2008-12-10T14:23:20.897 回答
53

我既突出了现有的尾随空格,又去掉了尾随空格。

我将我的编辑器(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()
于 2012-12-10T05:06:52.680 回答
13

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

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
于 2012-01-13T21:22:11.197 回答
8

从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\+$/
于 2011-08-31T10:33:18.970 回答
8

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

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

在此处输入图像描述

把这个放在你的.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()
于 2017-03-13T06:31:08.783 回答
5

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

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
于 2008-12-11T23:20:23.557 回答
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 中的所有行以删除它们的尾随空格。如果此命令管道成功,我们将删除存储。

于 2014-03-16T17:30:17.273 回答
1

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

set encoding=utf-8
set listchars=trail:·
set list
于 2014-10-10T12:53:56.127 回答
1

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

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
于 2016-08-11T18:34:07.060 回答
1

如果您修剪空白,您应该对已经干净的文件执行此操作。“在罗马的时候...”。在处理不受欢迎的虚假更改的代码库时,这是一种很好的礼仪。

此函数检测尾随空格并仅在它已经干净时才打开修剪。

这个想法的功劳归功于这里的评论: 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
于 2016-09-29T20:50:57.967 回答
1
autocmd BufWritePre *.py execute 'norm m`' | %s/\s\+$//e | norm g``

这将使光标保持在与保存之前相同的位置

于 2021-09-08T09:09:53.890 回答
0

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

于 2015-06-01T16:37:44.993 回答