pythonvimvirtualenvmacvim

Set python virtualenv in vim


I use vim for coding and for python coding in particular. Often I want to execute the current buffer with python interpreter. (for example to run unittests), usually I do this with :!python % <Enter>

This scenario will works fine with global python, but I want to run virtualenv python instead. How do I enable virtualenv within vim? Is it possible to switch virtualenv on the runtime?

I'm using macvim


Solution

  • Here's what I use (sorry the highlighting is screwy).

    " Function to activate a virtualenv in the embedded interpreter for
    " omnicomplete and other things like that.
    function LoadVirtualEnv(path)
        let activate_this = a:path . '/bin/activate_this.py'
        if getftype(a:path) == "dir" && filereadable(activate_this)
            python << EOF
    import vim
    activate_this = vim.eval('l:activate_this')
    execfile(activate_this, dict(__file__=activate_this))
    EOF
        endif
    endfunction
    
    " Load up a 'stable' virtualenv if one exists in ~/.virtualenv
    let defaultvirtualenv = $HOME . "/.virtualenvs/stable"
    
    " Only attempt to load this virtualenv if the defaultvirtualenv
    " actually exists, and we aren't running with a virtualenv active.
    if has("python")
        if empty($VIRTUAL_ENV) && getftype(defaultvirtualenv) == "dir"
            call LoadVirtualEnv(defaultvirtualenv)
        endif
    endif
    

    Note that you need to have MacVim compiled against the Python you are using for the virtualenv, e.g. if you downloaded Python 2.7 from Python.org you should recompile MacVim using --with-python-config-dir=/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config as an argument to ./configure.

    Hope that helps!

    EDIT: Just one note of attribution: A lot of the detective work that went into writing this little ditty was done by this blogger, and he deserves some of the credit.