Skip to content

Instantly share code, notes, and snippets.

@tommyip
Last active February 23, 2024 20:00
Show Gist options
  • Star 27 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save tommyip/cf9099fa6053e30247e5d0318de2fb9e to your computer and use it in GitHub Desktop.
Save tommyip/cf9099fa6053e30247e5d0318de2fb9e to your computer and use it in GitHub Desktop.
venv.fish - Automatically activate/deactivate virtualenv in fish shell
# Based on https://gist.github.com/bastibe/c0950e463ffdfdfada7adf149ae77c6f
# Changes:
# * Instead of overriding cd, we detect directory change. This allows the script to work
# for other means of cd, such as z.
# * Update syntax to work with new versions of fish.
# * Handle virtualenvs that are not located in the root of a git directory.
function __auto_source_venv --on-variable PWD --description "Activate/Deactivate virtualenv on directory change"
status --is-command-substitution; and return
# Check if we are inside a git directory
if git rev-parse --show-toplevel &>/dev/null
set gitdir (realpath (git rev-parse --show-toplevel))
set cwd (pwd -P)
# While we are still inside the git directory, find the closest
# virtualenv starting from the current directory.
while string match "$gitdir*" "$cwd" &>/dev/null
if test -e "$cwd/.venv/bin/activate.fish"
source "$cwd/.venv/bin/activate.fish" &>/dev/null
return
else
set cwd (path dirname "$cwd")
end
end
end
# If virtualenv activated but we are not in a git directory, deactivate.
if test -n "$VIRTUAL_ENV"
deactivate
end
end
@yifeikong
Copy link

This works great, Thanks.

@sqwxl
Copy link

sqwxl commented Nov 22, 2022

nice!

@Susensio
Copy link

Awesome!

@nakulj
Copy link

nakulj commented Jan 25, 2023

I have packaged this into a fisher plugin: https://github.com/nakulj/auto-venv

@sashaegorov
Copy link

Stunning!👍🏻

@rphes
Copy link

rphes commented Dec 6, 2023

Thanks for this!

If you call __auto_source_venv at the end of this script, your environment will also be activated when you open a shell in a Python project directory directly.

@tommyip
Copy link
Author

tommyip commented Jan 1, 2024

MacOS users - you might want to update to the latest version if your project resides in a location with uppercase directory names.

-    set cwd (pwd)
+    set cwd (pwd -P)

MacOS has a case insensitive file system where pwd (with the default -L/--logical flag) returns a path with lowercase directory names which causes issues with the case sensitive output of git --rev-parse.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment