{%- let section = "# =============================================================================\n#" -%} {%- let not_configured = "# -- not configured --" -%} {{ section }} # Utility functions for zoxide. # # Call zoxide binary, returning the output as UTF-8. function __zoxide_bin { $encoding = [Console]::OutputEncoding try { [Console]::OutputEncoding = [System.Text.Utf8Encoding]::new() $result = zoxide @args return $result } finally { [Console]::OutputEncoding = $encoding } } # pwd based on zoxide's format. function __zoxide_pwd { $cwd = Get-Location if ($cwd.Provider.Name -eq "FileSystem") { $cwd.ProviderPath } } # cd + custom logic based on the value of _ZO_ECHO. function __zoxide_cd($dir, $literal) { $dir = if ($literal) { Set-Location -LiteralPath $dir -Passthru -ErrorAction Stop } else { Set-Location -Path $dir -Passthru -ErrorAction Stop } {%- if echo %} Write-Output $dir.Path {%- endif %} } {{ section }} # Hook configuration for zoxide. # # Hook to add new entries to the database. function __zoxide_hook { $result = __zoxide_pwd if ($null -ne $result) { zoxide add -- $result } } # Initialize hook. {#- Initialize $__zoxide_hooked if it does not exist. Removing this will cause an unset variable error in StrictMode. #} $__zoxide_hooked = (Get-Variable __zoxide_hooked -ValueOnly -ErrorAction SilentlyContinue) if ($__zoxide_hooked -ne 1) { $__zoxide_hooked = 1 {%- match hook %} {%- when InitHook::None %} {{ not_configured }} {%- when InitHook::Prompt %} $prompt_old = $function:prompt function prompt { $null = __zoxide_hook & $prompt_old } {%- when InitHook::Pwd %} if ($PSVersionTable.PSVersion.Major -ge 6) { $ExecutionContext.InvokeCommand.LocationChangedAction = { $null = __zoxide_hook } } else { Write-Error ("`n" + "zoxide: PWD hooks are not supported below powershell 6.`n" + " Use 'zoxide init powershell --hook prompt' instead.") } {%- endmatch %} } {{ section }} # When using zoxide with --no-cmd, alias these internal functions as desired. # # Jump to a directory using only keywords. function __zoxide_z { if ($args.Length -eq 0) { __zoxide_cd ~ $true } elseif ( $args.Length -eq 1 -and (($args[0] -eq '-' -or $args[0] -eq '+') -or (Test-Path $args[0] -PathType Container)) ) { __zoxide_cd $args[0] $false } else { $result = __zoxide_pwd if ($null -ne $result) { $result = __zoxide_bin query --exclude $result -- @args } else { $result = __zoxide_bin query -- @args } if ($LASTEXITCODE -eq 0) { __zoxide_cd $result $true } } } # Jump to a directory using interactive search. function __zoxide_zi { $result = __zoxide_bin query -i -- @args if ($LASTEXITCODE -eq 0) { __zoxide_cd $result $true } } {{ section }} # Commands for zoxide. Disable these using --no-cmd. # {%- match cmd %} {%- when Some with (cmd) %} Set-Alias -Name {{cmd}} -Value __zoxide_z -Option AllScope -Scope Global -Force Set-Alias -Name {{cmd}}i -Value __zoxide_zi -Option AllScope -Scope Global -Force {%- when None %} {{ not_configured }} {%- endmatch %} {{ section }} # To initialize zoxide, add this to your configuration (find it by running # `echo $profile` in PowerShell): # # Invoke-Expression (& { $hook = if ($PSVersionTable.PSVersion.Major -ge 6) { 'pwd' } else { 'prompt' } (zoxide init powershell --hook $hook | Out-String) })