From bdedc2a813b37dc5abbd7159247df0bc01b0f123 Mon Sep 17 00:00:00 2001 From: Juhan280 Date: Thu, 12 Feb 2026 17:08:30 +0600 Subject: [PATCH] Wrap nushell integration script in a module This prevents the completion command "nu-complete __zoxide_z" from polluting the command namespace. --- templates/nushell.txt | 233 ++++++++++++++++++++++-------------------- 1 file changed, 121 insertions(+), 112 deletions(-) diff --git a/templates/nushell.txt b/templates/nushell.txt index dbd09e6..e3b45f4 100644 --- a/templates/nushell.txt +++ b/templates/nushell.txt @@ -1,133 +1,142 @@ -{%- let section = "# =============================================================================\n#" -%} +{%- let section = "# =============================================================================" -%} {%- let not_configured = "# -- not configured --" -%} # Code generated by zoxide. DO NOT EDIT. -const homedir = if $nu.home-dir? != null { $nu.home-dir } else { $nu.home-path } +module zoxide_integration { + const homedir = if $nu.home-dir? != null { $nu.home-dir } else { $nu.home-path } -{{ section }} -# Hook configuration for zoxide. -# + {{ section }} + # + # Hook configuration for zoxide. + # -{% if hook == InitHook::None -%} -{{ not_configured }} + {% if hook == InitHook::None -%} + {{ not_configured }} -{%- 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} - }) - } -{%- 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 %} - -{{ section }} -# Completion for __zoxide_z -# - -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 value - | insert span { start: ($ast | first).span.start, end: ($ast | last).span.end } - - { - options: { - sort: false, - case_sensitive: false, - completion_algorithm: "substring", + {%- 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} + }) } - completions: $completions, + {%- 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 %} } -} -{{ section }} -# When using zoxide with --no-cmd, alias these internal functions as desired. -# + {%- endif %} -# 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" + {{ section }} + # + # Completion for __zoxide_z + # + + 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 value + | insert span { start: ($ast | first).span.start, end: ($ast | last).span.end } + + { + options: { + sort: 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. -export 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) %} - -export alias {{cmd}} = __zoxide_z -export 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