Vim Tips Wiki
Tip 658 Printable Monobook Previous Next

created February 18, 2004 · complexity basic · author Max Ischenko · version 6.0

Doing a lot of programming in Python, I need to switch quickly between Python module and corresponding unit-test module. Often there is one unit-testing module for multiple python modules.

This function allows you to switch to correct unit testing module quickly, using the filename hardcoded at the end of the file. Idea is stolen from Twisted sources.

Put this to your ftplugin/python.vim:

nmap <buffer> <F5> :call JumpToTestFile()<CR>
fun! JumpToTestFile()
  let line = getline("$")
  if line =~ "^### testfile: "
    let filename = strpart(line, 14)
    execute ":e " . filename
    echo "TEST PATTERN ### testfile: NOT FOUND!"


Fix indents in following, and combine/clean.

I created this general purpose script (some may disagree since I dropped down to python scripting; sorry, just don't have time to hunt through docs for vim script info!) ... but if you have python compiled in with your vim, and happen to use a test framework, this with very little tweaking may help.

I generally have a 1:1 correspondence between modules and test scripts, so this approach saves me having to put test file names in my source.

inoremap <M-t> <Esc>:call UTestToggle()<CR>
nnoremap <M-t> :call UTestToggle()<CR>
function! UTestToggle()
python << EOF
# toggles between a path like: /myproject/ and /myproject/test/
# could mkdir the 'test' directory if not exists, but chances are the user will
# be doing that outside of vim anyway.
import vim
from os import path

curfile =
if curfile:
 if UTEST_PREFIX in curfile:
 # switch to the matching source
 vim.command('e %s' % curfile.replace(UTEST_PREFIX, ''))
 # switch to the matching|qpy
 filepath, filename = path.split(curfile)
 vim.command('e %s' % path.join(filepath, UTEST_PREFIX+filename))

Minor change, my fault for not testing it a bit. This rev switches to a buffer if the file is already in vim's buffer list, rather than calling the edit command. Was seeing instances where unsaved changes were lost. Note: vim complains about free() when I run this; gvim doesn't appear to, although that may just be surpressed output.


def edit(target):

# first try to load from buffer
for buf in vim.buffers:
if target ==
vim.command('b!%s' % buf.number)
# must not be in buffers, open file
vim.command('e! %s' % target)

curfile = if curfile:

if UTEST_PREFIX in curfile:
# switch to the matching source
edit(curfile.replace(UTEST_PREFIX, ))
# switch to the matching|qpy
filepath, filename = path.split(curfile)
edit(path.join(filepath, UTEST_PREFIX+filename))