Skip to content

Instantly share code, notes, and snippets.

@guelfey
Created August 16, 2013 22:01
Show Gist options
  • Save guelfey/6253836 to your computer and use it in GitHub Desktop.
Save guelfey/6253836 to your computer and use it in GitHub Desktop.
Vim plugin for Go test coverage profiles
" cover.vim - Vim plugin for Go test coverage profiles
" install in ftplugin/go
"
" ":Cover coverprofile" will open the current file in a new read-only window,
" highlighting the code regarding to whether it is covered by tests or not.
" You can change the colors by highlighting goTestCovered and goTestNotCovered
" from your vimrc.
if exists("b:did_ftplugin_go_cover")
finish
endif
if &t_Co > 255
highlight default goTestNotCovered ctermfg=124 guifg=#C00000
highlight default goTestCovered ctermfg=42 guifg=#2cd495
else
highlight default goTestNotCovered ctermfg=DarkRed guifg=#C00000
highlight default goTestCovered ctermfg=DarkGreen guifg=#2cd495
endif
command! -buffer -complete=file -nargs=1 Cover call s:GoCover(<f-args>)
function! s:GoCover(fname)
let contents = getbufline("", 1, "$")
let fullname = expand("%:p")
new
setlocal buftype=nofile bufhidden=hide noswapfile
call setline(1, contents[0])
for line in contents[1:]
call append(line("$"), line)
endfor
syn clear
let lines = readfile(a:fname)
for line in lines[1:]
let tokens = matchlist(line, '^\(.\+\):\(\d\+\).\(\d\+\),\(\d\+\).\(\d\+\) \d\+ \(\d\)')
if empty(tokens)
continue
endif
let gopath = split($GOPATH, ":")
for path in gopath
if fullname == path . "/src/" . tokens[1]
if tokens[6] == 0
let group = "goTestNotCovered"
else
let group = "goTestCovered"
endif
execute "syn region " . group . " start=/\\%" . tokens[2] . "l\\%" . tokens[3] . "c/ end=/\\%" . tokens[4] . "l\\%" . tokens[5] . "c/"
endif
endfor
endfor
setlocal noma
endfunction
let b:did_ftplugin_go_cover = 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment