Diff 模式下,让光标直接跳转到被修改的文本处

function! Jump2PrevDiffText()
    let line=line(".")
    let idx=col(".")-1
    if synIDattr(diff_hlID(line, idx), "name")=="DiffChange" || synIDattr(diff_hlID(line, idx), "name")=="DiffText"
        while idx>0
            if synIDattr(diff_hlID(line, idx), "name")=="DiffText" && synIDattr(diff_hlID(line, idx-1), "name")!="DiffText"
                call setpos(".", [0,line,idx])
                break
            elseif idx==1
                let line=line(".")
                let cols=col(".")
                exec "normal [c"
                if line==line(".") && cols==col(".")
                    return
                elseif synIDattr(diff_hlID(".", 1), "name")=="DiffChange" || synIDattr(diff_hlID(".", 1), "name")=="DiffText"
                    call setpos(".", [0,line("."),col("$")-1])
                    call Jump2PrevDiffText()
                endif
                break
            else
                let idx = idx-1
            endif
        endwhile
    else
        let line=line(".")
        let cols=col(".")
        exec "normal [c"
        if line==line(".") && cols==col(".")
            return
        elseif synIDattr(diff_hlID(".", 1), "name")=="DiffChange" || synIDattr(diff_hlID(".", 1), "name")=="DiffText"
            call setpos(".", [0,line("."),col("$")-1])
            call Jump2PrevDiffText()
        endif
    endif
endfunction
function! Jump2NextDiffText()
    if synIDattr(diff_hlID(".", col(".")), "name")=="DiffChange" || synIDattr(diff_hlID(".", col(".")), "name")=="DiffText"
        let line=line(".")
        let cols=col("$")-1
        let idx=col(".")+1
        while idx<=cols
            if synIDattr(diff_hlID(line, idx), "name")=="DiffText" && synIDattr(diff_hlID(line,idx-1), "name")!="DiffText"
                call setpos(".", [0,line,idx])
                echo line.",".idx.",".cols
                break
            elseif idx==cols
                let line=line(".")
                let cols=col(".")
                exec "normal ]c"
                if line==line(".") && cols==col(".")
                    return
                elseif synIDattr(diff_hlID(".", 1), "name")=="DiffChange" || synIDattr(diff_hlID(".", 1), "name")=="DiffText"
                    echoerr "inner"
                    call Jump2NextDiffText()
                endif
                break
            else
                let idx = idx+1
            endif
        endwhile
    else
        let line=line(".")
        let cols=col(".")
        exec "normal ]c"
        if line==line(".") && cols==col(".")
            return
        elseif synIDattr(diff_hlID(".", 1), "name")=="DiffChange" || synIDattr(diff_hlID(".", 1), "name")=="DiffText"
            call Jump2NextDiffText()
        endif
    endif
endfunction

" @see http://vim.wikia.com/wiki/Selecting_changes_in_diff_mode
if &diff
    nmap <F7> :call Jump2PrevDiffText()<cr>
    nmap <F8> :call Jump2NextDiffText()<cr>
else
    map <F7> :cp<cr>
    map <F8> :cn<cr>
endif

来源网站

Leave a comment?

Comments (伸缩/展开)