From 74ccc0232fcc05a2472d442f120b88f05e05ed66 Mon Sep 17 00:00:00 2001 From: Ajeet D'Souza <98ajeet@gmail.com> Date: Sun, 7 May 2023 19:19:53 +0530 Subject: [PATCH] Support for PWD hooks on all versions of PowerShell (#563) --- .github/CODE_OF_CONDUCT.md | 22 ++++++------ CHANGELOG.md | 6 ++-- README.md | 43 +++++++++-------------- man/man1/zoxide-init.1 | 5 +-- templates/powershell.txt | 72 +++++++++++++++++++++++--------------- 5 files changed, 75 insertions(+), 73 deletions(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index a2a6a67..609eb60 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -17,23 +17,23 @@ diverse, inclusive, and healthy community. Examples of behavior that contributes to a positive environment for our community include: -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the +- Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: -* The use of sexualized language or imagery, and sexual attention or +- The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities @@ -106,7 +106,7 @@ Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an +standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f86b66..d0b5332 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fish/Zsh: aliases on `__zoxide_z` will now use completions. - Nushell: add support for v0.78.0. - Fish: plugin now works on older versions. +- PowerShell: warn when PowerShell version is too old for `z -` and `z +`. +- PowerShell: support for PWD hooks on all versions. ### Fixed @@ -36,7 +38,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Nushell: upgrade minimum supported version to v0.73.0. - Zsh: fix extra space in interactive completions when no match is found. - Fzf: various improvements, upgrade minimum supported version to v0.33.0. -- Nushell: Accidental redefinition of hooks when initialized twice. +- Nushell: accidental redefinition of hooks when initialized twice. ### Removed @@ -140,7 +142,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- PowerShell: Hook not initializing correctly. +- PowerShell: hook not initializing correctly. ## [0.7.6] - 2021-10-13 diff --git a/README.md b/README.md index 01587de..16e1fbd 100644 --- a/README.md +++ b/README.md @@ -71,10 +71,10 @@ zoxide can be installed in 4 easy steps: > > | Distribution | Repository | Instructions | > | ------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------- | - > | ***Any*** | **[crates.io]** | `cargo install zoxide --locked` | - > | *Any* | [asdf] | `asdf plugin add zoxide https://github.com/nyrst/asdf-zoxide.git`
`asdf install zoxide latest` | - > | *Any* | [conda-forge] | `conda install -c conda-forge zoxide` | - > | *Any* | [Linuxbrew] | `brew install zoxide` | + > | **_Any_** | **[crates.io]** | `cargo install zoxide --locked` | + > | _Any_ | [asdf] | `asdf plugin add zoxide https://github.com/nyrst/asdf-zoxide.git`
`asdf install zoxide latest` | + > | _Any_ | [conda-forge] | `conda install -c conda-forge zoxide` | + > | _Any_ | [Linuxbrew] | `brew install zoxide` | > | Alpine Linux 3.13+ | [Alpine Linux Packages] | `apk add zoxide` | > | Arch Linux | [Arch Linux Community] | `pacman -S zoxide` | > | CentOS 7+ | [Copr] | `dnf copr enable atim/zoxide`
`dnf install zoxide` | @@ -147,7 +147,7 @@ zoxide can be installed in 4 easy steps: > > | Distribution | Repository | Instructions | > | ------------- | --------------- | ------------------------------- | - > | ***Any*** | **[crates.io]** | `cargo install zoxide --locked` | + > | **_Any_** | **[crates.io]** | `cargo install zoxide --locked` | > | DragonFly BSD | [DPorts] | `pkg install zoxide` | > | FreeBSD | [FreshPorts] | `pkg install zoxide` | > | NetBSD | [pkgsrc] | `pkgin install zoxide` | @@ -232,23 +232,9 @@ zoxide can be installed in 4 easy steps: > Add this to your configuration (find it by running `echo $profile` in > PowerShell): > - > - For zoxide v0.8.0+: - > - > ```powershell - > Invoke-Expression (& { - > $hook = if ($PSVersionTable.PSVersion.Major -lt 6) { 'prompt' } else { 'pwd' } - > (zoxide init --hook $hook powershell | Out-String) - > }) - > ``` - > - > - For older versions of zoxide: - > - > ```powershell - > Invoke-Expression (& { - > $hook = if ($PSVersionTable.PSVersion.Major -lt 6) { 'prompt' } else { 'pwd' } - > (zoxide init --hook $hook powershell) -join "`n" - > }) - > ``` + > ```powershell + > Invoke-Expression (& { (zoxide init powershell | Out-String) }) + > ``` @@ -272,7 +258,7 @@ zoxide can be installed in 4 easy steps: > eval "$(zoxide init zsh)" > ``` > - > For completions to work, the above line must be added *after* `compinit` is + > For completions to work, the above line must be added _after_ `compinit` is > called. You may have to rebuild your completions cache by running > `rm ~/.zcompdump*; compinit`. @@ -434,10 +420,13 @@ Environment variables[^2] can be used for configuration. They must be set before | [zabb] | Finds the shortest possible query for a path | Natively supported | | [zsh-autocomplete] | Realtime completions for zsh | Natively supported | -[^1]: Debian / Ubuntu derivatives update their packages very slowly. If you're -using one of these distributions, consider using the install script instead. -[^2]: If you're not sure how to set an environment variable on your shell, check -out the [wiki][wiki-env]. +[^1]: + Debian / Ubuntu derivatives update their packages very slowly. If you're + using one of these distributions, consider using the install script instead. + +[^2]: + If you're not sure how to set an environment variable on your shell, check + out the [wiki][wiki-env]. [algorithm-aging]: https://github.com/ajeetdsouza/zoxide/wiki/Algorithm#aging [algorithm-matching]: https://github.com/ajeetdsouza/zoxide/wiki/Algorithm#matching diff --git a/man/man1/zoxide-init.1 b/man/man1/zoxide-init.1 index 4b7d858..0a44b51 100644 --- a/man/man1/zoxide-init.1 +++ b/man/man1/zoxide-init.1 @@ -50,10 +50,7 @@ Add this to your configuration (find it by running \fBecho $profile\fR in PowerShell): .sp .nf - \fBInvoke-Expression (& { - $hook = if ($PSVersionTable.PSVersion.Major -lt 6) { 'prompt' } else { 'pwd' } - (zoxide init --hook $hook powershell | Out-String) - })\fR + \fBInvoke-Expression (& { (zoxide init powershell | Out-String) })\fR .fi .TP .B xonsh diff --git a/templates/powershell.txt b/templates/powershell.txt index 3df927a..00a0b05 100644 --- a/templates/powershell.txt +++ b/templates/powershell.txt @@ -30,7 +30,15 @@ function __zoxide_cd($dir, $literal) { $dir = if ($literal) { Set-Location -LiteralPath $dir -Passthru -ErrorAction Stop } else { - Set-Location -Path $dir -Passthru -ErrorAction Stop + if ($dir -eq '-' -and ($PSVersionTable.PSVersion -lt 6.1)) { + Write-Error "cd - is not supported below PowerShell 6.1. Please upgrade your version of PowerShell." + } + elseif ($dir -eq '+' -and ($PSVersionTable.PSVersion -lt 6.2)) { + Write-Error "cd + is not supported below PowerShell 6.2. Please upgrade your version of PowerShell." + } + else { + Set-Location -Path $dir -Passthru -ErrorAction Stop + } } {%- if echo %} Write-Output $dir.Path @@ -41,6 +49,15 @@ function __zoxide_cd($dir, $literal) { # Hook configuration for zoxide. # +{% if hook == InitHook::None -%} +{{ not_configured }} + +{%- else -%} +{#- + Initialize $__zoxide_hooked if it does not exist. Removing this will cause an + unset variable error in StrictMode. +-#} +{%- if hook == InitHook::Prompt -%} # Hook to add new entries to the database. function __zoxide_hook { $result = __zoxide_pwd @@ -48,37 +65,34 @@ function __zoxide_hook { zoxide add -- $result } } +{%- else if hook == InitHook::Pwd -%} +# Hook to add new entries to the database. +$global:__zoxide_oldpwd = __zoxide_pwd +function __zoxide_hook { + $result = __zoxide_pwd + if ($result -ne $global:__zoxide_oldpwd) { + if ($null -ne $result) { + zoxide add -- $result + } + $global:__zoxide_oldpwd = $result + } +} +{%- endif %} # 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) +$__zoxide_hooked = (Get-Variable __zoxide_hooked -ErrorAction SilentlyContinue -ValueOnly) if ($__zoxide_hooked -ne 1) { $__zoxide_hooked = 1 -{%- match hook %} -{%- when InitHook::None %} - {{ not_configured }} -{%- when InitHook::Prompt %} - $prompt_old = $function:prompt + $__zoxide_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 + if ($null -ne $__zoxide_prompt_old) { + & $__zoxide_prompt_old } + $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 %} } +{%- endif %} {{ section }} # When using zoxide with --no-cmd, alias these internal functions as desired. @@ -89,12 +103,12 @@ 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)) - ) { + elseif ($args.Length -eq 1 -and ($args[0] -eq '-' -or $args[0] -eq '+')) { __zoxide_cd $args[0] $false } + elseif ($args.Length -eq 1 -and (Test-Path $args[0] -PathType Container)) { + __zoxide_cd $args[0] $true + } else { $result = __zoxide_pwd if ($null -ne $result) { @@ -137,4 +151,4 @@ Set-Alias -Name {{cmd}}i -Value __zoxide_zi -Option AllScope -Scope Global -Forc # 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) }) +# Invoke-Expression (& { (zoxide init powershell | Out-String) })