Author SHA1 Message Date
Carlo SalaandCopilot Autofix powered by AI 62e5024454 Fix URL encoding for HOST and PWD variables
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-09-10 13:55:55 +02:00
Robby RussellandCopilot Autofix powered by AI f68258fdf1 Apply batched suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-09-06 08:47:04 -07:00
Robby RussellandClaude Fable 5.1 f9cba205e1 perf(termsupport): don't re-encode the cwd URL on every prompt
`omz_termsupport_cwd` percent-encoded $HOST and $PWD on every prompt,
each through a command substitution that forks a subshell. Keep the
encoded URL and only recompute it when $HOST or $PWD changed. The OSC 7
sequence is still emitted on every prompt as before.

Output verified identical for paths with spaces, unicode and `&`, for
the root directory, for Konsole (host omitted) and after a host change.
Measured on macOS arm64, zsh 5.9: ~2-9 ms -> 0.03 ms per prompt when
the directory is unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 08:10:43 -07:00
2 changed files with 25 additions and 49 deletions
+14 -7
View File
@@ -146,16 +146,23 @@ esac
# the host name to disambiguate local vs. remote paths.
function omz_termsupport_cwd {
setopt localoptions unset
# Percent-encode the host and path names.
local URL_HOST URL_PATH
URL_HOST="$(omz_urlencode -P $HOST)" || return 1
URL_PATH="$(omz_urlencode -P $PWD)" || return 1
# Percent-encode the host and path names. Encoding forks a subshell each,
# so keep the result and only redo it when $HOST or $PWD changed.
local cache_key="$HOST:$PWD:${KONSOLE_PROFILE_NAME:+1}:${KONSOLE_DBUS_SESSION:+1}"
if [[ "$_omz_termsupport_cwd_key" != "$cache_key" ]]; then
local URL_HOST URL_PATH
URL_HOST="$(omz_urlencode -P "$HOST")" || return 1
URL_PATH="$(omz_urlencode -P "$PWD")" || return 1
# Konsole errors if the HOST is provided
[[ -z "$KONSOLE_PROFILE_NAME" && -z "$KONSOLE_DBUS_SESSION" ]] || URL_HOST=""
# Konsole errors if the HOST is provided
[[ -z "$KONSOLE_PROFILE_NAME" && -z "$KONSOLE_DBUS_SESSION" ]] || URL_HOST=""
typeset -g _omz_termsupport_cwd_key="$cache_key"
typeset -g _omz_termsupport_cwd_url="file://${URL_HOST}${URL_PATH}"
fi
# common control sequence (OSC 7) to set current host and path
printf "\e]7;file://%s%s\e\\" "${URL_HOST}" "${URL_PATH}"
printf "\e]7;%s\e\\" "$_omz_termsupport_cwd_url"
}
# Use a precmd hook instead of a chpwd hook to avoid contaminating output
+11 -42
View File
@@ -38,47 +38,16 @@
# due to malicious input as a consequence of CVE-2021-45444, which affects
# zsh versions from 5.0.3 to 5.8.
#
# The patch is applied when VCS_INFO_formats is first called, since loading
# and patching it on every startup costs time in shells that never use
# vcs_info. `autoload` doesn't replace an already defined function, so this
# wrapper survives a later `autoload -Uz vcs_info` in a theme or .zshrc, and
# vcs_info's own `autoload -Uz VCS_INFO_formats`.
if (( $+functions[VCS_INFO_formats] )); then
() {
autoload -Uz +X regexp-replace 2>/dev/null || return 1
autoload -Uz +X regexp-replace VCS_INFO_formats 2>/dev/null || return 0
# We use $tmp here because it's already a local variable in VCS_INFO_formats
local PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
# Unique string to avoid reapplying the patch if this code gets called twice
local PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
# Only patch the VCS_INFO_formats function if not already patched
if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
regexp-replace 'functions[VCS_INFO_formats]' \
"VCS_INFO_hook 'post-backend'" \
': ${PATCH_ID}; ${PATCH}; ${MATCH}'
fi
}
else
function VCS_INFO_formats {
local loaded_function="$(
unfunction VCS_INFO_formats 2>/dev/null
autoload -Uz +X VCS_INFO_formats 2>/dev/null || return 1
print -r -- "$functions[VCS_INFO_formats]"
)" || return 1
functions[VCS_INFO_formats]="$loaded_function"
autoload -Uz +X regexp-replace 2>/dev/null || return 1
# We use $tmp here because it's already a local variable in VCS_INFO_formats
local PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
# Unique string to avoid reapplying the patch if this code gets called twice
local PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
# Only patch the VCS_INFO_formats function if not already patched
if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
regexp-replace 'functions[VCS_INFO_formats]' \
"VCS_INFO_hook 'post-backend'" \
': ${PATCH_ID}; ${PATCH}; ${MATCH}'
fi
VCS_INFO_formats "$@"
}
# We use $tmp here because it's already a local variable in VCS_INFO_formats
typeset PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
# Unique string to avoid reapplying the patch if this code gets called twice
typeset PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
# Only patch the VCS_INFO_formats function if not already patched
if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
regexp-replace 'functions[VCS_INFO_formats]' \
"VCS_INFO_hook 'post-backend'" \
': ${PATCH_ID}; ${PATCH}; ${MATCH}'
fi
unset PATCH PATCH_ID