diff --git a/README.md b/README.md index 878fba0..fec50da 100644 --- a/README.md +++ b/README.md @@ -270,7 +270,7 @@ zoxide can be installed in 4 easy steps: > ``` > > **Note:** - > zoxide only supports Nushell v0.89.0+. + > zoxide only supports Nushell v0.106.0+. diff --git a/templates/nushell.txt b/templates/nushell.txt index 4153b39..31f19de 100644 --- a/templates/nushell.txt +++ b/templates/nushell.txt @@ -1,101 +1,134 @@ -{%- let section = "# =============================================================================\n#" -%} +{%- let section = "# =============================================================================" -%} {%- let not_configured = "# -- not configured --" -%} # Code generated by zoxide. DO NOT EDIT. -{{ section }} -# Hook configuration for zoxide. -# +module zoxide_integration { + # From version 0.110.0, $nu.home-path has been renamed to $nu.home-dir + const homedir = if $nu.home-dir? != null { $nu.home-dir } else { $nu.home-path } -{% if hook == InitHook::None -%} -{{ not_configured }} + {{ section }} + # + # Hook configuration for zoxide. + # -{%- else -%} -# Initialize hook to add new entries to the database. -export-env { -{%- if hook == InitHook::Prompt %} - $env.config = ( - $env.config? - | default {} - | upsert hooks { default {} } - | upsert hooks.pre_prompt { default [] } - ) - let __zoxide_hooked = ( - $env.config.hooks.pre_prompt | any { try { get __zoxide_hook } catch { false } } - ) - if not $__zoxide_hooked { - $env.config.hooks.pre_prompt = ($env.config.hooks.pre_prompt | append { - __zoxide_hook: true, - code: {|| ^zoxide add -- $env.PWD} - }) + {% if hook == InitHook::None -%} + {{ not_configured }} + + {%- else -%} + # Initialize hook to add new entries to the database. + export-env { + {%- if hook == InitHook::Prompt %} + let __zoxide_hooked = ( + $env.config.hooks.pre_prompt + | any { get __zoxide_hook? | default false } + ) + if not $__zoxide_hooked { + $env.config.hooks.pre_prompt = ($env.config.hooks.pre_prompt | append { + __zoxide_hook: true, + code: {|| ^zoxide add -- $env.PWD} + }) + } + {%- else if hook == InitHook::Pwd %} + let __zoxide_hooked = ( + $env.config.hooks.env_change.PWD? | default [] + | any { get __zoxide_hook? | default false } + ) + if not $__zoxide_hooked { + $env.config.hooks.env_change.PWD = ($env.config.hooks.env_change.PWD? | append { + __zoxide_hook: true, + code: {|_, dir| ^zoxide add -- $dir} + }) + } + {%- endif %} } -{%- else if hook == InitHook::Pwd %} - $env.config = ( - $env.config? - | default {} - | upsert hooks { default {} } - | upsert hooks.env_change { default {} } - | upsert hooks.env_change.PWD { default [] } - ) - let __zoxide_hooked = ( - $env.config.hooks.env_change.PWD | any { try { get __zoxide_hook } catch { false } } - ) - if not $__zoxide_hooked { - $env.config.hooks.env_change.PWD = ($env.config.hooks.env_change.PWD | append { - __zoxide_hook: true, - code: {|_, dir| ^zoxide add -- $dir} - }) - } -{%- endif %} -} -{%- endif %} + {%- endif %} -{{ section }} -# When using zoxide with --no-cmd, alias these internal functions as desired. -# + {{ section }} + # + # Completion for __zoxide_z + # -# Jump to a directory using only keywords. -def --env --wrapped __zoxide_z [...rest: string] { - let path = match $rest { - [] => {'~'}, - [ '-' ] => {'-'}, - [ $arg ] if ($arg | path expand | path type) == 'dir' => {$arg} - _ => { - ^zoxide query --exclude $env.PWD -- ...$rest | str trim -r -c "\n" + def "nu-complete __zoxide_z" [context: string] { + let ast = ast --flatten $context | skip 1 + + # If the user has typed a space after the first argument, use the custom + # completer. If not, use the built-in directory completion. + if ($ast | is-empty) { return null } + if $ast.0.span.end >= ($context | str length) { return null } + + let completions = ^zoxide query --exclude $env.PWD --list -- ...$ast.content + | lines | each { + if $in starts-with $"($homedir)(char psep)" { + str replace $homedir "~" + } else {} + } | wrap display_override + | insert value { get display_override | debug --raw-value } + | insert span { start: ($ast | first).span.start, end: ($ast | last).span.end } + + { + options: { + sort: false, + filter: false, + case_sensitive: false, + completion_algorithm: "substring", + } + completions: $completions, } } - cd $path -{%- if echo %} - echo $env.PWD -{%- endif %} + + {{ section }} + # + # When using zoxide with --no-cmd, alias these internal functions as desired. + # + + # Jump to a directory using only keywords. + export def --env --wrapped __zoxide_z [...rest: directory@"nu-complete __zoxide_z"] { + let path = match $rest { + [] => {'~'}, + [ '-' ] => {'-'}, + [ $arg ] if ($arg | path expand | path type) == 'dir' => {$arg} + _ => { + ^zoxide query --exclude $env.PWD -- ...$rest | str trim -r -c "\n" + } + } + cd $path + {%- if echo %} + echo $env.PWD + {%- endif %} + } + + # Jump to a directory using interactive search. + export def --env --wrapped __zoxide_zi [...rest: string] { + cd $'(^zoxide query --interactive -- ...$rest | str trim -r -c "\n")' + {%- if echo %} + echo $env.PWD + {%- endif %} + } + + {{ section }} + # + # Commands for zoxide. Disable these using --no-cmd. + # + + {%- match cmd %} + {%- when Some with (cmd) %} + + export alias {{cmd}} = __zoxide_z + export alias {{cmd}}i = __zoxide_zi + + {%- when None %} + + {{ not_configured }} + + {%- endmatch %} } -# Jump to a directory using interactive search. -def --env --wrapped __zoxide_zi [...rest:string] { - cd $'(^zoxide query --interactive -- ...$rest | str trim -r -c "\n")' -{%- if echo %} - echo $env.PWD -{%- endif %} -} +export use zoxide_integration * {{ section }} -# Commands for zoxide. Disable these using --no-cmd. # - -{%- match cmd %} -{%- when Some with (cmd) %} - -alias {{cmd}} = __zoxide_z -alias {{cmd}}i = __zoxide_zi - -{%- when None %} - -{{ not_configured }} - -{%- endmatch %} - -{{ section }} # Add this to your env file (find it by running `$nu.env-path` in Nushell): # # zoxide init nushell | save -f ~/.zoxide.nu @@ -105,4 +138,4 @@ alias {{cmd}}i = __zoxide_zi # # source ~/.zoxide.nu # -# Note: zoxide only supports Nushell v0.89.0+. +# Note: zoxide only supports Nushell v0.106.0+.