如何在vim中自动删除尾部空格

时间:2008-12-10 14:02:31

标签: vim automation whitespace removing-whitespace

我试图在git中提交一些文件时出现“尾随空白”错误。

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

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

13 个答案:

答案 0 :(得分:201)

我找到了答案here

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

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

答案 1 :(得分:163)

编辑上述加上保存光标位置:

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

答案 2 :(得分:66)

我通常也有:

match Todo /\s\+$/

在我的.vimrc文件中,以便明确行尾空白。

Todo是一种语法高亮显示group-name,用于处理像TODOFIXMEXXX这样的关键字。它有一种令人讨厌的淡黄色背景颜色,我发现你在代码中想要的东西是最好的: - )

答案 3 :(得分:51)

我都突出显示现有的尾部空格,并且还会删除尾随空格。

我将编辑器(vim)配置为在末尾显示空白区域,例如

enter image description here

在我的.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()

答案 4 :(得分:13)

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

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

答案 5 :(得分: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\+$/

答案 6 :(得分:6)

我在评论中看到了这个解决方案 VIM Wikia - Remove unwanted spaces

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

enter image description here

将其放入.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()

答案 7 :(得分:5)

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

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

答案 8 :(得分: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中的所有+行,以便在我们将更改重新应用到工作目录时删除它们的尾随空格。如果此命令管道成功,我们将删除存储。

答案 9 :(得分:1)

.vimrc文件中使用MacVim时,其他方法在某种程度上对我无效。所以这里有一个能够突出显示尾随空格的内容:

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

对于想要针对特定​​文件类型运行它的人(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

答案 12 :(得分:0)

如果修剪空格,则对已经清理的文件执行此操作。 “在罗马的时候...”。在处理虚假变化不受欢迎的代码库时,这是一个很好的礼仪。

此功能检测尾随空白,只有在已经清洁时才开启修剪。

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

   <ListView
            android:layout_width="match_parent"
            android:layout_height="330dp"
            android:id="@+id/dutch_runner_list_view"
            style="@style/ListViewStyle"
            android:clickable="true" />