feat(nushell): re-export completions for use-based startup

- switch completion module imports to export use so externs propagate

- extend managed completion command set and required file checks

- rename prompt static cache env var to PJ_LEFT_PROMPT_STATIC_PART

- load completion module via use in nu_polyjuice
This commit is contained in:
2026-05-30 21:38:36 +08:00
parent 4aaf4199bd
commit 10d133444d
3 changed files with 38 additions and 47 deletions
+35 -44
View File
@@ -1,4 +1,21 @@
def "pj completion" [
const pj_module_dir = (path self | path dirname)
const pj_completion_base_dir = ($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions')
const pj_completion_commands = [git ssh cargo uv rustup make pytest rg tar fzf vscode winget zig]
def _pj_completion_script_path [name: string] {
($pj_completion_base_dir | path join $name $"($name)-completions.nu")
}
def _pj_required_completion_files [] {
$pj_completion_commands | each {|name|
{
command: $name
file: (_pj_completion_script_path $name)
}
}
}
export def "pj completion" [
--update(-u) # Pull latest changes when repo already exists.
--force(-f) # Re-clone even when repo already exists.
] {
@@ -47,18 +64,11 @@ def "pj completion" [
}
}
let required = [
($completion_dir | path join 'git' 'git-completions.nu')
($completion_dir | path join 'ssh' 'ssh-completions.nu')
($completion_dir | path join 'cargo' 'cargo-completions.nu')
($completion_dir | path join 'uv' 'uv-completions.nu')
($completion_dir | path join 'rustup' 'rustup-completions.nu')
]
let missing = ($required | where {|f| not ($f | path exists) })
let required = (_pj_required_completion_files)
let missing = ($required | where {|it| not ($it.file | path exists) })
if not ($missing | is-empty) {
print "[pj completion] warning: some required completion files are missing:"
$missing | each {|f| print $" - ($f)" }
$missing | each {|it| print $" - ($it.command): ($it.file)" }
}
print "[pj completion] ok"
@@ -66,6 +76,7 @@ def "pj completion" [
cache_dir: $cache_dir
repo_dir: $repo_dir
completion_dir: $completion_dir
commands: $pj_completion_commands
missing_files: $missing
}
}
@@ -85,36 +96,16 @@ export-env {
}
}
const pj_module_dir = (path self | path dirname)
const git_completion = if (($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions' 'git' 'git-completions.nu') | path exists) {
($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions' 'git' 'git-completions.nu')
} else {
null
}
const ssh_completion = if (($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions' 'ssh' 'ssh-completions.nu') | path exists) {
($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions' 'ssh' 'ssh-completions.nu')
} else {
null
}
const cargo_completion = if (($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions' 'cargo' 'cargo-completions.nu') | path exists) {
($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions' 'cargo' 'cargo-completions.nu')
} else {
null
}
const uv_completion = if (($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions' 'uv' 'uv-completions.nu') | path exists) {
($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions' 'uv' 'uv-completions.nu')
} else {
null
}
const rustup_completion = if (($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions' 'rustup' 'rustup-completions.nu') | path exists) {
($pj_module_dir | path join '..' 'cache' 'nu_scripts' 'custom-completions' 'rustup' 'rustup-completions.nu')
} else {
null
}
use $git_completion *
use $ssh_completion *
use $cargo_completion *
use $uv_completion *
use $rustup_completion *
# Re-export imported extern signatures so they are visible when this module is `use`d.
export use ($pj_completion_base_dir | path join 'git' 'git-completions.nu') *
export use ($pj_completion_base_dir | path join 'ssh' 'ssh-completions.nu') *
export use ($pj_completion_base_dir | path join 'cargo' 'cargo-completions.nu') *
export use ($pj_completion_base_dir | path join 'uv' 'uv-completions.nu') *
export use ($pj_completion_base_dir | path join 'rustup' 'rustup-completions.nu') *
export use ($pj_completion_base_dir | path join 'make' 'make-completions.nu') *
export use ($pj_completion_base_dir | path join 'pytest' 'pytest-completions.nu') *
export use ($pj_completion_base_dir | path join 'rg' 'rg-completions.nu') *
export use ($pj_completion_base_dir | path join 'tar' 'tar-completions.nu') *
export use ($pj_completion_base_dir | path join 'vscode' 'vscode-completions.nu') *
export use ($pj_completion_base_dir | path join 'winget' 'winget-completions.nu') *
export use ($pj_completion_base_dir | path join 'zig' 'zig-completions.nu') *
+2 -2
View File
@@ -572,7 +572,7 @@ def _pj_prompt_static_base [] {
def _pj_left_prompt [] {
let p = ($env.PJ_PROMPT_PALETTE? | default (_pj_palette_default))
let static = ($env.PJ_PROMPT_STATIC? | default (_pj_prompt_static_base))
let static = ($env.PJ_LEFT_PROMPT_STATIC_PART? | default (_pj_prompt_static_base))
let user_color = if ($static.effective_user == "root") { $p.c_root } else { $p.c_user }
@@ -635,7 +635,7 @@ export-env {
load-env {
PJ_PROMPT_PALETTE: (_pj_palette_default)
PJ_OS_KEY: (_pj_detect_os_key)
PJ_PROMPT_STATIC: (_pj_prompt_static_base)
PJ_LEFT_PROMPT_STATIC_PART: (_pj_prompt_static_base)
PROMPT_MULTILINE_INDICATOR: ":"
PROMPT_INDICATOR: {||
_pj_prompt_indicator
+1 -1
View File
@@ -6,7 +6,7 @@ $env.NU_POLYJUICE_PATH = $env.FILE_PWD
# modules
use modules/pj_aliases.nu *
source modules/pj_completions.nu
use modules/pj_completions.nu *
use modules/pj_helix.nu *
use modules/pj_fzf.nu *
use modules/pj_zoxide.nu *