Virtualenv is an awesome tool for managing python environments. Sadly enough it does not work so well with Fish out of the box. Based on http://coderseye.com/2010/using-virtualenv-with-fish-shell.html, I got a thin wrapper working for Fish:
1 function mkvirtualenv -d "Create a new virtual environment in $WORKON\_HOME"
2 set tgt {$WORKON\_HOME}$argv[1]
3 if [ -d $tgt ]
4 echo "$tgt exists already"
5 else
6 pushd $WORKON\_HOME
7 virtualenv --distribute $argv[1]
8 popd
9 end
10 end
11
12 function workon -d "Activate virtual environment in $WORKON\_HOME"
13 set tgt {$WORKON\_HOME}$argv[1]
14 if [ -d $tgt ]
15 pushd $tgt
16 deactivate
17 set -gx VIRTUAL\_ENV "$tgt"
18 set -gx \_OLD\_VIRTUAL\_PATH $PATH
19 set -gx PATH "$VIRTUAL\_ENV/bin" $PATH
20
21 # unset PYTHONHOME if set
22 if set -q PYTHONHOME
23 set -gx \_OLD\_VIRTUAL\_PYTHONHOME $PYTHONHOME
24 set -e PYTHONHOME
25 end
26 popd
27 else
28 echo "$tgt not found"
29 end
30 end
31
32 complete -c workon -a "(cd $WORKON\_HOME; ls -d \*)"
33
34 function deactivate -d "Exit virtualenv and return to normal shell environment"
35 # reset old environment variables
36 if test -n "$\_OLD\_VIRTUAL\_PATH"
37 set -gx PATH $\_OLD\_VIRTUAL\_PATH
38 set -e \_OLD\_VIRTUAL\_PATH
39 end
40
41 if test -n "$\_OLD\_VIRTUAL\_PYTHONHOME"
42 set -gx PYTHONHOME $\_OLD\_VIRTUAL\_PYTHONHOME
43 set -e \_OLD\_VIRTUAL\_PYTHONHOME
44 end
45 set -e VIRTUAL\_ENV
46 end
For the prompt I am using the following code
1 if set -q VIRTUAL\_ENV
2 printf '%s[%s]%s %s %s%s%s> ' (set\_color -b blue white) (basename "$VIRTUAL\_ENV") (set\_color normal) $USER "$\_\_fish\_prompt\_cwd" (prompt\_pwd) "$\_\_fish\_prompt\_normal"
3 else
4 printf '%s %s%s%s> ' $USER "$\_\_fish\_prompt\_cwd" (prompt\_pwd) "$\_\_fish\_prompt\_normal"
5 end
Which adds a prefix to my prompt when I have activated an environment.