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) })