我在尝试在git中提交某些文件时遇到“尾随空白”错误。
我想在保存python文件之前自动删除这些结尾的空格字符。
您可以配置vim来做到这一点吗?如果是这样,怎么办?
我在尝试在git中提交某些文件时遇到“尾随空白”错误。
我想在保存python文件之前自动删除这些结尾的空格字符。
您可以配置vim来做到这一点吗?如果是这样,怎么办?
Answers:
e
,最后的意思是,如果我们找不到模式,vi不会将替代命令视为失败
以上编译加上保存光标位置:
fun! <SID>StripTrailingWhitespaces()
let l = line(".")
let c = col(".")
keepp %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()
autocmd FileType c,cpp,java,php,ruby,python
部分以使其适用于所有文件。
<buffer>
,*
则还需要替换为@ swt83
keepp
keepp %s/\s\+$//e
我通常也有:
match Todo /\s\+$/
在我的.vimrc
文件中,使行尾空格突出显示。
藤堂是一个语法高亮显示组名称是用于高亮显示了类似的关键字TODO
,FIXME
或XXX
。它具有令人讨厌的淡黄色背景色,我发现最好在代码中突出显示您不需要的内容 :-)
:hi Todo
。所以,我仔细阅读:hi <Tab>
和:help hi
。我认为Cursor
和Error
,但我想我会尝试match VisualNOS /\s\+$/
。我可以将其与autocmd
此处其他答案中的s 结合使用。
我既突出显示了现有的尾随空白,也删除了尾随空白。
我将编辑器(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用于红宝石文件,再次在我的〜/ .vimrc中
function! TrimWhiteSpace()
%s/\s\+$//e
endfunction
autocmd BufWritePre *.rb :call TrimWhiteSpace()
从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的评论中看到了此解决方案 -删除不需要的空格
我真的很喜欢它。.
在不需要的空格上添加一个。
.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
%s
全局(g)标志与EOL中的空格一样无用:-)
在所有情况下都不能接受仅从文件中删除尾随空格的解决方案。它将在从一开始就具有此策略的项目中工作,因此没有空白,您不只是将自己添加到即将到来的提交中。
假设您只希望不添加尾随空格的新实例,而不影响未编辑行中的现有空格,以使提交的内容不受与工作无关的更改的影响。
在这种情况下,使用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中的所有行以删除其尾随空格。如果此命令管道成功,则将隐藏存储。
如果修剪空白,则只应在已经干净的文件上进行。“在罗马的时候...”。在不受欢迎的情况下使用代码库时,这是一种很好的礼节。
此功能可检测到尾随空白,并仅在已清除的情况下才打开修剪。
这个想法的功劳归功于这里的评论瑰宝: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
let _s=@/
并将其恢复到`let @ / = _ s'结尾。在这种情况下,我们使用黑洞寄存器