我在尝试在 Git 中提交一些文件时遇到“尾随空格”错误。
我想在保存 Python 文件之前自动删除这些尾随空格字符。
你能配置 Vim 来做到这一点吗?如果是这样,怎么做?
我在尝试在 Git 中提交一些文件时遇到“尾随空格”错误。
我想在保存 Python 文件之前自动删除这些尾随空格字符。
你能配置 Vim 来做到这一点吗?如果是这样,怎么做?
我在这里找到了答案。
将以下内容添加到我的 .vimrc 文件中就可以了:
autocmd BufWritePre *.py :%s/\s\+$//e
最后的e
标志意味着如果搜索模式失败,该命令不会发出错误消息。查看:h :s_flags
更多。
上面的编译加上保存光标位置:
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()
我通常也有一个:
match Todo /\s\+$/
在我的.vimrc
文件中,因此行尾空白被突出显示。
Todo 是一种语法高亮组名,用于高亮关键字,如TODO
,FIXME
或XXX
. 它有一个令人讨厌的难看的淡黄色背景颜色,我发现最好在代码中突出显示你不想要的东西:-)
我既突出了现有的尾随空格,又去掉了尾随空格。
我将我的编辑器(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复制和粘贴(链接不再有效,但您需要的位在下面)
“这样做的好处是不会突出显示您在行尾键入的每个空格,只有在您打开文件或离开插入模式时才会突出显示。非常整洁。”
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\+$/
我在 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()
我就是这样做的。我不记得我从哪里偷来的。
autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
%s/[ \t]\+$//ge
%s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
仅从文件中删除尾随空格的解决方案在所有情况下都是不可接受的。它将在从一开始就具有此策略的项目中工作,因此没有这样的空白,您不只是将自己添加到即将到来的提交中。
假设您只想不添加尾随空白的新实例,而不影响您未编辑的行中的现有空白,以使您的提交免受与您的工作无关的更改。
在这种情况下,使用 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 中的所有行以删除它们的尾随空格。如果此命令管道成功,我们将删除存储。
当在文件中使用时,这里的其他方法在 MacVim 中对我不起作用.vimrc
。所以这是一个突出尾随空格的方法:
set encoding=utf-8
set listchars=trail:·
set list
对于想要为特定文件类型运行它的人(文件类型并不总是可靠的):
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
如果您修剪空白,您应该只对已经干净的文件执行此操作。“在罗马的时候...”。在处理不受欢迎的虚假更改的代码库时,这是一种很好的礼仪。
此函数检测尾随空格并仅在它已经干净时才打开修剪。
这个想法的功劳归功于这里的评论: 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
autocmd BufWritePre *.py execute 'norm m`' | %s/\s\+$//e | norm g``
这将使光标保持在与保存之前相同的位置
autocmd BufWritePre * :%s/\s\+$//<CR>:let @/=''<CR>