diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index 852a543c5..622821304 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -146,16 +146,22 @@ 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. + if [[ "$_omz_termsupport_cwd_key" != "$HOST:$PWD" ]]; 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="$HOST:$PWD" + 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