This is rough and needs a lot of cleaning up, but first, install Johan Lindstrom's Devel::CoverX::Covered. Then go into some directory where you have a test directory and run this bash script (stolen straight from the docs):
#!/bin/bash
#Clean up from previous test run
cover -delete
#Test run with coverage instrumentation
PERL5OPT=-MDevel::Cover prove -r t
#Collect covered and caller information
# Run this _before_ running "cover"
# Don't run with Devel::Covered enabled
covered runs
#Post process to generate covered database
cover -report Html_basic
Then, somewhere in your .vimrc (or better yet, a plugin), you have something like this:
au! FileType perl :call PerlMappings()
au! BufRead,BufNewFile *.t :call PerlTestMappings()
" if it's a .pm file and it's in the t/ directory, we hope
" it's a Test::Class test. This is fragile :/
au! BufNewFile,BufRead *.pm
\ if match(bufname('%'), '^t\>') > -1 |
\ call PerlTestMappings() |
\ else |
\ call PerlMappings() |
\ endif
function! PerlMappings()
noremap ,tc :call Coverage()
noremap K :!perldoc perldoc -f
endfunction
function! PerlTestMappings()
noremap ,t :!prove -vl %
endfunction
function! Coverage()
let filename = bufname('%')
if match(filename, '\.t$') > -1
let command = 'covered by --test_file="'. filename .'"'
else
let command = 'covered covering --source_file="'. filename .'"'
end
let result = split( system(command), "\n" )
let list = []
let counter = 1
for element in result
let list = list + [ counter . ": " . element ]
let counter = counter + 1
endfor
let file = inputlist(list)
execute "edit " . result[ file - 1 ]
endfunction
Now, if you're in a Perl module or a test file, you can type ',tc' and get a list of the tests covering the module or modules the test covers. Select the number of the one you want to edit and you automatically edit it.
This needs a lot more work, including much better error checking, but I am happy with the start of this.