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

10-13 09:35