我在Git提交一些文件时遇到了“尾随空格”错误。
我想在保存Python文件之前自动删除这些尾随空格字符。
你能否配置Vim来实现这个功能?如果可以,怎么做?
我在Git提交一些文件时遇到了“尾随空格”错误。
我想在保存Python文件之前自动删除这些尾随空格字符。
你能否配置Vim来实现这个功能?如果可以,怎么做?
我在这里找到了答案。
将以下内容添加到我的 .vimrc 文件中就可以解决问题:
autocmd BufWritePre *.py :%s/\s\+$//e
结尾处的e
标志表示如果搜索模式失败,该命令不会发出错误信息。请参见:h :s_flags
了解更多信息。
gi
跳转到最后插入文本的位置(不一定是在:%s
命令之前的光标位置),而:%!sed -r 's/\s+$//'
则跳转到文件开头。我不明白keepjumps
应该如何使用,:keepjumps :%s/\s+$//e
似乎没有任何不同。我使用的是:%s/\s\+$//e|normal ''
,它似乎按照我的预期工作(回到使用:%s
命令之前的光标位置)。 - humodze
表示如果没有找到匹配的模式,vi 不认为替换命令失败。 - LLenain以上内容的编译以及保存光标位置:
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()
keepp
前缀,则不会修改你的搜索历史记录,例如 keepp %s/\s\+$//e
。 - jeberle我通常也有一个:
match Todo /\s\+$/
为了让行末的空格显示出来,我在.vimrc
文件中添加了以下配置:
highlight Todo ctermbg=yellow ctermfg=black guibg=yellow guifg=black
match Todo /s\+$/
其中,Todo
是一个语法高亮的组名,它用于高亮关键字,如TODO
、FIXME
或XXX
。它默认有一个非常难看的黄色背景,我发现它最适合用来突出显示代码中不应该出现的内容 :-)
:hi Todo
进行检查。所以我浏览了一下 :hi <Tab>
和 :help hi
。我考虑了 Cursor
和 Error
,但我想我会尝试 match VisualNOS /\s\+$/
。我可能会将其与其他答案中的一些 autocmd
结合使用。 - Brady Trainor我既强调现有的尾随空格,也清除尾随空格。
我将我的编辑器(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()
以下是一种可以按多个文件类型过滤的方法。
autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
我在VIM Wikia - 删除不需要的空格评论中发现了这个解决方案。
我真的很喜欢它。在不需要的空格上添加.
。
.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()
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
简单地去除文件末尾的空格并不适用于所有情况。它可以在一开始就按照这个政策进行的项目中工作,因此没有你自己在即将提交的修改中添加的这种空格。
假设你只希望不添加新的末尾空格,而不影响你未编辑的行中现有的空格,以便让你的提交不受与你的工作无关的更改的影响。
在这种情况下,使用 git,你可以使用像这样的脚本:
#!/bin/sh
set -e # bail on errors
git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop
也就是说,我们先将更改存储起来,然后在将更改应用到工作目录时,过滤掉差异中所有+
行的尾随空格。如果此命令管道执行成功,我们就会丢弃存储。
对于想要针对特定文件类型运行它的人(文件类型并不总是可靠的):
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