Unverified Commit 25c2c3a4 authored by Alexander Schlarb's avatar Alexander Schlarb Committed by Marc Cornellà

feat(lib): send OSC 7 on directory change for more supported terminals (#9914)

Previously this was only emitted on macOS with Apple's Terminal.app (and compatible clones like iTerm2), but it is used by other terminal emulators as well to obtain the actual current working directory wiht symlinks intact. All non-supporting terminal emulators tested gracefully ignored this value, so emit this on these as well in case they (or some other app masquarading as them) add future support for this value. Closes #9914 Co-authored-by: 's avatarMarc Cornellà <hello@mcornella.com>
parent 33aadece
...@@ -109,28 +109,52 @@ if [[ -z "$INSIDE_EMACS" || "$INSIDE_EMACS" = vterm ]]; then ...@@ -109,28 +109,52 @@ if [[ -z "$INSIDE_EMACS" || "$INSIDE_EMACS" = vterm ]]; then
add-zsh-hook preexec omz_termsupport_preexec add-zsh-hook preexec omz_termsupport_preexec
fi fi
# Keep Apple Terminal.app's current working directory updated # Keep terminal emulator's current working directory correct,
# Based on this answer: https://superuser.com/a/315029 # even if the current working directory path contains symbolic links
# With extra fixes to handle multibyte chars and non-UTF-8 locales #
# References:
if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then # - Apple's Terminal.app: https://superuser.com/a/315029
# Emits the control sequence to notify Terminal.app of the cwd # - iTerm2: https://iterm2.com/documentation-escape-codes.html (iTerm2 Extension / CurrentDir+RemoteHost)
# Identifies the directory using a file: URI scheme, including # - Konsole: https://bugs.kde.org/show_bug.cgi?id=327720#c1
# the host name to disambiguate local vs. remote paths. # - libvte (gnome-terminal, mate-terminal, …): https://bugzilla.gnome.org/show_bug.cgi?id=675987#c14
function update_terminalapp_cwd() { # Apparently it had a bug before ~2012 were it would display the unknown OSC 7 code
emulate -L zsh #
# As of May 2021 mlterm, PuTTY, rxvt, screen, termux & xterm simply ignore the unknown OSC.
# Don't define the function if we're inside Emacs
if [[ -n "$INSIDE_EMACS" ]]; then
return
fi
# Don't define the function if we're in an unsupported terminal
case "$TERM" in
# all of these either process OSC 7 correctly or ignore entirely
xterm*|putty*|rxvt*|konsole*|mlterm*|alacritty|screen*|tmux*) ;;
contour*|foot*) ;;
*)
# Terminal.app and iTerm2 process OSC 7 correctly
case "$TERM_PROGRAM" in
Apple_Terminal|iTerm.app) ;;
*) return ;;
esac ;;
esac
# Emits the control sequence to notify many terminal emulators
# of the cwd
#
# Identifies the directory using a file: URI scheme, including
# the host name to disambiguate local vs. remote paths.
function omz_termsupport_cwd {
# Percent-encode the host and path names. # Percent-encode the host and path names.
local URL_HOST URL_PATH local URL_HOST URL_PATH
URL_HOST="$(omz_urlencode -P $HOST)" || return 1 URL_HOST="$(omz_urlencode -P $HOST)" || return 1
URL_PATH="$(omz_urlencode -P $PWD)" || return 1 URL_PATH="$(omz_urlencode -P $PWD)" || return 1
# Undocumented Terminal.app-specific control sequence # common control sequence (OSC 7) to set current host and path
printf '\e]7;%s\a' "file://$URL_HOST$URL_PATH" printf "\e]7;%s\a" "file://${URL_HOST}${URL_PATH}"
} }
# Use a precmd hook instead of a chpwd hook to avoid contaminating output # Use a precmd hook instead of a chpwd hook to avoid contaminating output
add-zsh-hook precmd update_terminalapp_cwd # i.e. when a script or function changes directory without `cd -q`, chpwd
# Run once to get initial cwd set # will be called the output may be swallowed by the script or function.
update_terminalapp_cwd add-zsh-hook precmd omz_termsupport_cwd
fi
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment