如何仅从更改的行

时间:2015-08-31 10:51:37

标签: git vim

我想将Vim配置为仅从我更改的行中去掉尾部空格。我的用例是我们的存储库中的很多文件在它们的某些行上都有尾随空格,如果我不加选择地剥离所有尾随空格,那么git blame会将我显示为更改这些行的人。我想在Vim中这样做,而不是通过预提交钩子,因为我不希望在Vim中重新加载文件,因为这会混淆我的撤消历史记录。

2 个答案:

答案 0 :(得分:1)

我不确定这是否是您想要的(也许您想使用git blame等等 - ?),但是,如果您使用vim-gitgutter插件,则可以依赖{{ 1}}函数来实现这样的东西(只是一个想法):

GitGutterGetHunks()

当然,使用该插件,你甚至可以跳过这个,只需查看左侧显示的标志,以便直观地选择修改/添加的行并调用替换命令,或者删除一个简单的自定义命令包装器手动选择范围的尾随空格。

该命令可以在分段之前调用,任意次(理想情况下,保存后 - 在任何情况下,当符号/帅哥同步时)。

答案 1 :(得分:0)

function! s:linesNotComitted(filename)
    let l:blameResult = system('git blame -sn ' . shellescape(a:filename))
    let l:blameResultLines = split(l:blameResult, "[\n\r]")
    let l:result = []
    for l:line in l:blameResultLines
        let l:match = matchlist(l:line, '\v^0+\s(\d+)')
        if !empty(l:match)
            call add(l:result, str2nr(l:match[1]))
        endif
    endfor
    return l:result
endfunction

function! s:stripTrailingWhitespaceFromLines(lineNumbers)
    for l:lineNumber in a:lineNumbers
        let l:line = getline(l:lineNumber)
        let l:modifiedLine = substitute(l:line, '\v\s+$', '', '')
        if l:line != l:modifiedLine
            call setline(l:lineNumber, l:modifiedLine)
        endif
    endfor
endfunction

command! StripTrailingWhitespaceFromNotComittedLines call s:stripTrailingWhitespaceFromLines(s:linesNotComitted(expand('%')))