Set python virtualenv in vim

19,893

Solution 1

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.

Solution 2

Activate your virtualenv before starting vim. You will automatically get the corresponding interpreter instance.

Solution 3

You can create a function with an alias for vim to auto load/unload the virtualenv if it exists at the location from which you start it.

In this example, it checks for the virtualenv in .venv/bin/activate.

vimVenAutoload() {
    if [ -e .venv/bin/activate ]; then
        . .venv/bin/activate;
        vim $*;
        deactivate;
    else
        vim $*;
    fi;
}
alias vim="vimVenAutoload"

You can add this to your .bashrc or .bash_profile.

Small caveat: If a virtualenv is already loaded, it will be overwritten with the new one.

Solution 4

There is also a vim plugin on github:

https://github.com/jmcantrell/vim-virtualenv

I have not tried it, but it seems to solve the question as well.

Share:
19,893
ak.
Author by

ak.

Updated on June 02, 2022

Comments

  • ak.
    ak. almost 2 years

    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 scenatio will work 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

  • ak.
    ak. over 13 years
    I'm using MacVim, and I start it from the Dock, so it's not really a good option... As far as I understand activating the virtualenv is all about modifying the PATH, PYTHONHOME and PYTHONPATH env vars, maybe some other too. I dont mind to port the virtualenv's activate script to vim, I was just wondering if there is an existing solution.
  • ak.
    ak. over 13 years
    wow, cool, this is what I was looking for, thanks a lot! I didn't know virtualenv creates this activate_this.py
  • Lionel
    Lionel almost 11 years
    I've tried this, but it doesn't seem to work on Mac OSX 10.8 (Mountain Lion) -- some other underlying issue perhaps exists
  • Lionel
    Lionel almost 11 years
    Hi dwf, could you take a look at my question here to see why my output is weird? stackoverflow.com/questions/17288843/…
  • Nolsto
    Nolsto about 9 years
    @Chris: This is most likely because of this issue.
  • hwjp
    hwjp almost 8 years
    I'm finding this doesn't work if the virtualenv python is a different version from the vim-compiled one (eg 2 vs 3)
  • Zoe stands with Ukraine
    Zoe stands with Ukraine almost 4 years
    In Python 3: exec(open(activate_this).read(), { "__file__": activate_this })