I've patched together some vim scripts, a vim plugin, tmux, perl modules, and a three-line bash script to create an efficient way of running and debugging my code with minimal effort. I thought I'd share and get some feedback and maybe others will find this useful, too. As easy as this is to get set up, it took me a lot of trial and error to get right so hopefully I will save some of you out there looking to do something similar a lot of pain and aggravation. And, yes, I realize there are other vim plugins for this task but none of them satisfied my exact needs (especially the syntax highlighting) or they came with lots of other baggage I didn't want or need. Plus, I wanted to get more familiar with vim so I decided to roll my own.
Note: I don't believe this will work with gvim because this solution relies on tmux, a terminal-based program.
With a *.t test file open in vim, hit <F7> (without even having to save first!) to run a prove command on your test. The output of the test gets opened in a new tmux pane (Pane B) to the right of my vim window. As the test runs, you can still edit your file since output of the test is in a tmux pane. The other advantage to seeing the live output of prove is that it gives your peace of mind that your script is actually working while also getting a rough gauge on which parts of the code are slow or if your script is stuck in some infinite loop. Mixed in with prove's output are messages generated by the Log4perl module (trace, debug, info, etc. statements). Once the script finishes running, prove's raw output in Pane B gets replaced with a new vim session which pulls in prove's output that was saved using prove's --archive option. The reason for re-displaying prove's output in vim is so you can have it syntax highlighted to a high degree to help you pick out the relevant files and line numbers where errors occurred, as well as easily pick out debug information and other useful output. After the test script's output gets loaded into vim, focus is automatically returned back to your test file in the pane on the left. Once errors and warnings are fixed up, you can code some more and then hit <F7> again to start the process over.
I won't go into any detail on getting any of these components installed or how they work. Google is your friend.
Here are the needed lines to get your vim files working with the tmuxify plugin once it's installed. Replace <your_home_directory> in the last line with something suitable for your machine. If you don't have a wide terminal, or want your output to appear along the bottom of the your test script instead of next to it, change the -h in the third line to a -d.
nmap <F7> :w<CR>\mk:q!\ms<CR>\mq\mr imap <F7> <ESC>:w<CR>\mk:q!\ms<CR>\mq\mr let g:tmuxify_custom_command = 'tmux split-window -h' let g:rel_file_name = @% let g:tmuxify_run = { 'perl': '<your_home_directory>/run_tests.sh ' . +g:rel_file_name }
This is what makes the output of your test code super readable. In your .vim directory, create a new directory called syntax (if it doesn't already exist) and place the following code into a file called test.vim. You can, of course, tweak and improve this to your liking. I am not an expert at vim syntax highlighting so this can probably be improved and definitely shortened a great deal.
syn match Good "^ok " syn region okline contains=Good start="^ok" end="\n" syn match builder_line "Builder\.pm line \d\+\." syn match lineno "line \d\+\.*\n" syn match line_no "Line \d\+\:" syn match error_msg "^# \t.*at"hs=s+3 syn match perl_lib "perl_lib\/.*\.pm"hs=s+9 syn match file " at [^\/]\+\.p[ml] "hs=s+3 syn match subtest_file "^\s\+#\s\+.*at .*line \d\+\.\n"hs=s+5 syn match test_file "\/[^\/]\+\/t\/.*\.t "hs=s+1 syn match my_error "^[^(ok |not ok |#)].*line \d\+\.\n" syn region not_ok_subtest contains=subtest_file start="^\s\+not ok \d\ ++" end="^\s\+#.*expected.*\n" " end="^\s\+#.*line \d\+\.\n" syn region Bad contains=warning start="^not ok " end="^\ze[^#]"re=e-1, +he=e-1 syn region warning contains=test_file,file,lineno,perl_lib,error_msg,b +uilder_line start="^#\s\+Failed" end="^\ze[^#]"re=e-1,he=e-1 syn match comment "^#.*\n" syn match premature "^# Looks like.*\n" syn region dump start="$VAR\d\+\s=\s"rs=s-1 end=";\n" syn match divider "----*" syn match warn 'WARN\|ERROR' syn match script contains=warn '[A-Z]\{4,5}.*> ' hi Good cterm=bold ctermfg=Green hi divider cterm=bold ctermfg=yellow ctermbg=black hi dump ctermfg=LightBlue hi okline ctermfg=Green hi warning cterm=none ctermfg=Red hi my_error cterm=none ctermfg=Red hi premature cterm=none ctermfg=Red hi failed cterm=none ctermfg=Red hi Bad cterm=bold,underline ctermfg=Red␣ hi comment ctermfg=Cyan hi lineno ctermfg=White hi line_no ctermfg=White hi file ctermfg=White hi test_file ctermfg=White hi perl_lib ctermfg=White hi error_msg ctermfg=Green hi builder_line cterm=none ctermfg=Red hi not_ok_subtest ctermfg=Red hi warn ctermfg=Red hi subtest_file ctermfg=White hi script ctermfg=White
This simple script gets run by tmuxify when you hit the <F7> key. Call the file run_tests.sh and place it into the home directory on your machine (the same directory referenced in the .vimrc file above.
prove --merge --normalize -v $1 -a test.tgz vim -nR -c ":silent 0read ! tar xfO test.tgz $1" -c ':set nonumber' -c + ':syntax sync fromstart' -c ':set syntax=test' -c ':silent !tmux se +lect-pane -L' !!! PUT A BLANK LINE HERE !!!!
Note that the 3rd line should be a blank line. For some reason, it seems to be needed to avoid having to hit the return key after the last command is run. And don't forget to chmod the bash file to make it executable.
You will of course need to make sure your test file has use Test::More at the top of the file. Also, I highly recommend the log4perl module to help sprinkle your output with helpful debug output and other useful information that will help you keep track of what your code is doing and how it is behaving.
That's it. Happy testing and debugging!
$PM = "Perl Monk's";
$MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate";
$nysus = $PM . ' ' . $MCF;
Click here if you love Perl Monks
In reply to A recipe for testing and debugging with vim by nysus
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |