Skip to content

Commit d7adaf9

Browse files
authored
Fix $env.PATH for direnv (#1083)
While using direnv with nushell, I noticed that my autocompletion for external programs stopped working as soon as I entered a directory and direnv loaded. Turns out, direnv exports $PATH as a string, and nushell stores $PATH as a table and expects it to be one. Worse, nu just silently fails any operations with the $PATH (except for running programs) instead of reporting an error. This PR fixes that by adding a line in the direnv config.nu script that parses that string into the appropriate table. Testing it on my system (NixOS, nushell, direnv + lorri) it seems to work perfectly fine and the $PATH works again.
1 parent b7869a8 commit d7adaf9

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

nu-hooks/nu-hooks/direnv/config.nu

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,8 @@
2323
}
2424

2525
direnv export json | from json | default {} | load-env
26+
# Direnv outputs $PATH as a string, but nushell silently breaks if isn't a list-like table.
27+
# The following behemoth of Nu code turns this into nu's format while following the standards of how to handle quotes, use it if you need quote handling instead of the line below it:
28+
# $env.PATH = $env.PATH | parse --regex ('' + `((?:(?:"(?:(?:\\[\\"])|.)*?")|(?:'.*?')|[^` + (char env_sep) + `]*)*)`) | each {|x| $x.capture0 | parse --regex `(?:"((?:(?:\\"|.))*?)")|(?:'(.*?)')|([^'"]*)` | each {|y| if ($y.capture0 != "") { $y.capture0 | str replace -ar `\\([\\"])` `$1` } else if ($y.capture1 != "") { $y.capture1 } else $y.capture2 } | str join }
29+
$env.PATH = $env.PATH | split row (char env_sep)
2630
}

0 commit comments

Comments
 (0)