Hi Aarto!

On Fr, 09 Apr 2010, Aarto Matti wrote:

> Does any body know if there exists a plugin to highlight code changes.
> I know at least two IDEs with that feature, few links:
> 
> http://blog.eveningcreek.com/?p=151
> http://edn.embarcadero.com/article/33453#6PersonalDeveloperProductivity
> 
> Usually it works so, highlight new lines with green, modified with
> yellow. In vim it could actually look just like that (screenshot from
> vim-complexity for python):
> 
> http://blog.extracheese.org/2009/10/vim_complexity.png

Hm, I see, someone mentioned already a different plugin, but anyhow, 
attached is one I just created.

regards,
Christian

-- 
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

To unsubscribe, reply using "remove me" as the subject.
" Changes.vim - Using Signs for indicating changed lines
" ---------------------------------------------------------------
" Version:  0.1
" Authors:  Christian Brabandt <[email protected]>
" Last Change: 2010/04/10
" Script:  <not yet available>
" License: VIM License
" GetLatestVimScripts: <not yet available>

" Configuration:"{{{
" Exit quickly when:
" - this plugin was already loaded
" - when 'compatible' is set

if exists('loaded_changes') || &cp
    finish
endif"}}}

" Documentation:"{{{
" To see differences with your file, exexute:
" :EnableChanges
"
" The following variables will be accepted:
"
" g:changes_hl_lines
" If set, all lines will be highlighted, else
" only an indication will be displayed on the first column
" (default: 0)
"
" g:changes_autocmd
" Updates the indication for changed lines automatically,
" if the user does not press a key for 'updatetime' seconds when
" Vim is not in insert mode. See :h 'updatetime'
" (default: 0)
"
" g:changes_verbose
" Output a short description, what these colors mean
" (default: 1)
"
" Colors for indicating the changes
" By default changes.vim displays deleted lines using the hilighting
" DiffDelete, added lines using DiffAdd and modified lines using
" DiffChange.
" You can see how these are defined, by issuing 
" :hi DiffAdd
" :hi DiffDelete
" :hi DiffChange
" See also the help :h hl-DiffAdd :h hl-DiffChange and :h hl-DiffDelete
"
" If you'd like to change these colors, simply change these hilighting items
" see :h :hi
" "}}}

let loaded_changes = 1

" Check preconditions"{{{
if !has("diff") 
    call <sid>WarningMsg("Diff support not available in your Vim version.")
    call <sid>WarningMsg("changes plugin will not be working!")
    finish
endif

if  !has("signs")
    call <sid>WarningMsg("Sign Support support not available in your Vim 
version.")
    call <sid>WarningMsg("changes plugin will not be working!")
    finish
endif

if !executable("diff") || executable("diff") == -1
    call <sid>WarningMsg("No diff executable found")
    call <sid>WarningMsg("changes plugin will not be working!")
    finish
endif"}}}

fu! <sid>WarningMsg(msg)"{{{
    echohl WarningMsg
    echo a:msg
    echohl Normal
endfu"}}}

fu! <sid>Output()"{{{
    echohl Title
    echo "Differences will be highlighted like this:"
    echohl Normal
    echo "========================================="
    echohl DiffAdd
    echo "+ Added Lines"
    echohl DiffDelete
    echo "- Deleted Lines"
    echohl DiffChange
    echo "* Changed Lines"
    echohl Normal
endfu"}}}

fu! <sid>Init()"{{{
    let s:hl_lines = (exists("g:changes_hl_lines") ? g:changes_hl_lines : 0)
    let s:autocmd  = (exists("g:changes_autocmd")  ? g:changes_autocmd  : 0)
    let s:verbose  = (exists("g:changes_verbose")  ? g:changes_verbose  : 1)

    let s:signs={}
    let s:ids={}
    let s:signs["add"] = "texthl=DiffAdd text=+ texthl=DiffAdd " . ( 
(s:hl_lines) ? " linehl=DiffAdd" : "")
    let s:signs["del"] = "texthl=DiffDelete text=- texthl=DiffDelete " . ( 
(s:hl_lines) ? " linehl=DiffDelete" : "")
    let s:signs["chg"] = "texthl=DiffChange text=* texthl=DiffChange " . ( 
(s:hl_lines) ? " linehl=DiffDelete" : "")

    let s:ids["add"]   = hlID("DiffAdd")
    let s:ids["del"]   = hlID("DiffDelete")
    let s:ids["ch"]    = hlID("DiffChange")
    call <sid>DefineSigns()
    call <sid>AuCmd(s:autocmd)
endfu"}}}

fu! <sid>AuCmd(arg)"{{{
    if s:autocmd && a:arg
        augroup Changes
                autocmd!
                au CursorHold * :call <sid>GetDiff()
        augroup END
    else
        augroup Changes
                autocmd!
        augroup END
    endif
endfu!"}}}

fu! <sid>DefineSigns()"{{{
    exe "sign define add" s:signs["add"]
    exe "sign define del" s:signs["del"]
    exe "sign define ch"  s:signs["chg"]
endfu"}}}

fu! <sid>GetDiff()"{{{
    call <sid>Init()
    let o_lz=&lz
    let o_fdm=&fdm
    setl lz
    sign unplace *
    call <sid>MakeDiff()
    let b:diffhl={'add': [], 'del': [], 'ch': []}
    let line=1
    while line <= line('$')
        let id=diff_hlID(line,1)
        if  (id == 0)
            let line+=1
            continue
        elseif (id == s:ids["add"])
            let b:diffhl['add'] = b:diffhl['add'] + [ line ]
        else
            let b:diffhl['ch']  = b:diffhl['ch'] + [ line ]
        endif
        let line+=1
    endw
    " Switch to other buffer and check for deleted lines
    wincmd p
    " For some reason, getbufvar setbufvar do not work, so 
    " we use a temporary script variable here
    let s:temp={'del': []}
    let line=1
    while line <= line('$')
        let id=diff_hlID(line,1)
        if (id == s:ids["add"])
            let s:temp['del'] = s:temp['del'] + [ line ]
        endif
        let line+=1
    endw
    wincmd p
    let b:diffhl['del'] = s:temp['del']
    call <sid>PlaceSigns(b:diffhl)
    call <sid>DiffOff()
    let &lz=o_lz
    let &fdm=o_fdm
endfu"}}}

fu! <sid>PlaceSigns(dict)"{{{
    for [ id, lines ] in items(a:dict)
        for item in lines
            exe "sign place " . item . " line=" . item . " name=" . id . " 
buffer=" . bufnr('')
        endfor
    endfor
endfu"}}}
            
fu! <sid>MakeDiff()"{{{
    " Get diff for current buffer with original
    vert new
    set bt=nofile
    r #
    0d_
    diffthis
    wincmd p
    diffthis
endfu"}}}

fu! <sid>DiffOff()"{{{
    " Turn off Diff Mode and close buffer
    wincmd p
    diffoff!
    q
endfu"}}}

fu! <sid>CleanUp()"{{{
    sign unplace *
    sign undefine add
    sign undefine del
    sign undefine ch
    call <sid>AuCmd(0)
endfu"}}}

" Define User-Commands and Autocommand "{{{
com! EnableChanges :call <sid>GetDiff()|:call <sid>Output()
com! DisableChanges :call <sid>CleanUp()"}}}

call <sid>Init()

" Modeline
" vi:fdm=marker fdl=0

Reply via email to