From d7adaf9880fae1af523be9650732fbfeb03c0fd0 Mon Sep 17 00:00:00 2001 From: BattyBest <114404879+BattyBest@users.noreply.github.com> Date: Sun, 13 Apr 2025 01:10:03 +0000 Subject: [PATCH] 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. --- nu-hooks/nu-hooks/direnv/config.nu | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nu-hooks/nu-hooks/direnv/config.nu b/nu-hooks/nu-hooks/direnv/config.nu index 6bcc2be..2cb7efc 100644 --- a/nu-hooks/nu-hooks/direnv/config.nu +++ b/nu-hooks/nu-hooks/direnv/config.nu @@ -23,4 +23,8 @@ } direnv export json | from json | default {} | load-env + # Direnv outputs $PATH as a string, but nushell silently breaks if isn't a list-like table. + # 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: + # $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 } + $env.PATH = $env.PATH | split row (char env_sep) }