我在我的 .vimrc 中添加了以下函数,用于在保存之前删除尾随空格
fun! <SID>StripTrailingWhitespaces()
let l = line(".")
let c = col(".")
%s/\s\+$//e
call cursor(l, c)
endfun
autocmd BufWritePre *.h :call <SID>StripTrailingWhitespaces()
autocmd BufWritePre *.cpp :call <SID>StripTrailingWhitespaces()
autocmd BufWritePre *.c :call <SID>StripTrailingWhitespaces()
它真的很好用。但是,在某些情况下,我只想从我编辑过的行中删除尾随空格。这是为了确保我的
diff
输出看起来很正常,因为对于某些遗留代码文件,几乎所有行都有尾随空格,我不想给我的代码审查人员带来不必要的差异。diff -b
现在不是解决方案,因为它还会忽略一行中任何地方的空白,有时这种变化很重要,足以包含在 diff
输出中。所以我的问题是 - 是否可以仅从 vim 文件中在此 session 中编辑过的行中去除尾随空格?
最佳答案
mMontu's answer 有正确的想法,但它不能处理边缘情况。也就是说,如果我将光标向下移动,然后再向上移动,所有这些都处于编辑模式,它不会获取对这些行的更改。如果我们想处理这个,那么我们需要存储用户访问的顶行和底行。这是一些更健壮的代码,所有内容都分组到函数中:
fun! <SID>SetupTrailingWhitespaces()
let curline = line('.')
let b:insert_top = curline
let b:insert_bottom = curline
endfun
fun! <SID>UpdateTrailingWhitespace()
let curline = line('.')
if b:insert_top > curline
let b:insert_top = curline
elseif b:insert_bottom < curline
let b:insert_bottom = curline
endif
endfun
fun! <SID>StripTrailingWhitespaces()
let original_cursor = getpos('.')
exe b:insert_top ',' b:insert_bottom 's/\s\+$//e'
call setpos('.', original_cursor)
endfun
现在我们只是在正确的时间调用这些函数:
autocmd InsertEnter * :call <SID>SetupTrailingWhitespaces()
autocmd InsertLeave * :call <SID>StripTrailingWhitespaces()
autocmd CursorMovedI * :call <SID>UpdateTrailingWhitespace()
或者,我编写了 a plugin 来提供这个更新的功能,还有一些额外的功能,比如在正常模式下剥离。
关于vim - 仅删除已编辑行的尾随空白,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8309728/