activate.nu 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. # virtualenv activation module:
  2. # - Activate with `overlay use activate.nu`
  3. # - Deactivate with `deactivate`, as usual
  4. #
  5. # To customize the overlay name, you can call `overlay use activate.nu as foo`, but then simply `deactivate` won't work
  6. # because it is just an alias to hide the "activate" overlay. You'd need to call `overlay hide foo` manually.
  7. module warning {
  8. export-env {
  9. const file = path self
  10. error make -u {
  11. msg: $"`($file | path basename)` is meant to be used with `overlay use`, not `source`"
  12. }
  13. }
  14. }
  15. use warning
  16. export-env {
  17. let nu_ver = (version | get version | split row '.' | take 2 | each { into int })
  18. if $nu_ver.0 == 0 and $nu_ver.1 < 106 {
  19. error make {
  20. msg: 'virtualenv Nushell activation requires Nushell 0.106 or greater.'
  21. }
  22. }
  23. def is-string [x] {
  24. ($x | describe) == 'string'
  25. }
  26. def has-env [...names] {
  27. $names | each {|n| $n in $env } | all {|i| $i }
  28. }
  29. def is-env-true [name: string] {
  30. if (has-env $name) {
  31. let val = ($env | get --optional $name)
  32. if ($val | describe) == 'bool' {
  33. $val
  34. } else {
  35. not ($val | is-empty)
  36. }
  37. } else {
  38. false
  39. }
  40. }
  41. let virtual_env = __VIRTUAL_ENV__
  42. let bin = __BIN_NAME__
  43. let path_name = if (has-env 'Path') { 'Path' } else { 'PATH' }
  44. let venv_path = ([$virtual_env $bin] | path join)
  45. let new_path = ($env | get $path_name | prepend $venv_path)
  46. let virtual_env_prompt = if (__VIRTUAL_PROMPT__ | is-empty) {
  47. ($virtual_env | path basename)
  48. } else {
  49. __VIRTUAL_PROMPT__
  50. }
  51. let old_pkg_config_path = if (has-env 'PKG_CONFIG_PATH') { $env.PKG_CONFIG_PATH } else { '' }
  52. let new_pkg_config_path = $'($virtual_env)/lib/pkgconfig:($old_pkg_config_path)'
  53. let new_env = { $path_name: $new_path VIRTUAL_ENV: $virtual_env VIRTUAL_ENV_PROMPT: $virtual_env_prompt PKG_CONFIG_PATH: $new_pkg_config_path }
  54. if (has-env 'TCL_LIBRARY') {
  55. let $new_env = $new_env | insert TCL_LIBRARY __TCL_LIBRARY__
  56. }
  57. if (has-env 'TK_LIBRARY') {
  58. let $new_env = $new_env | insert TK_LIBRARY __TK_LIBRARY__
  59. }
  60. let old_prompt_command = if (has-env 'PROMPT_COMMAND') { $env.PROMPT_COMMAND } else { '' }
  61. let new_env = if (is-env-true 'VIRTUAL_ENV_DISABLE_PROMPT') {
  62. $new_env
  63. } else {
  64. let virtual_prefix = $'(char lparen)($virtual_env_prompt)(char rparen) '
  65. let new_prompt = if (has-env 'PROMPT_COMMAND') {
  66. if ('closure' in ($old_prompt_command | describe)) {
  67. {|| $'($virtual_prefix)(do $old_prompt_command)' }
  68. } else {
  69. {|| $'($virtual_prefix)($old_prompt_command)' }
  70. }
  71. } else {
  72. {|| $'($virtual_prefix)' }
  73. }
  74. $new_env | merge { PROMPT_COMMAND: $new_prompt VIRTUAL_PREFIX: $virtual_prefix }
  75. }
  76. load-env $new_env
  77. }
  78. export alias pydoc = python -m pydoc
  79. export alias deactivate = overlay hide activate