@ -109,28 +109,52 @@ if [[ -z "$INSIDE_EMACS" || "$INSIDE_EMACS" = vterm ]]; then
add-zsh-hook preexec omz_termsupport_preexec
fi
# Keep Apple Terminal.app's current working directory updated
# Based on this answer: https://superuser.com/a/315029
# With extra fixes to handle multibyte chars and non-UTF-8 locales
if [ [ " $TERM_PROGRAM " = = "Apple_Terminal" ] ] && [ [ -z " $INSIDE_EMACS " ] ] ; then
# Emits the control sequence to notify Terminal.app of the cwd
# Identifies the directory using a file: URI scheme, including
# the host name to disambiguate local vs. remote paths.
function update_terminalapp_cwd( ) {
emulate -L zsh
# 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
# Undocumented Terminal.app-specific control sequence
printf '\e]7;%s\a' " file:// $URL_HOST $URL_PATH "
}
# Use a precmd hook instead of a chpwd hook to avoid contaminating output
add-zsh-hook precmd update_terminalapp_cwd
# Run once to get initial cwd set
update_terminalapp_cwd
# Keep terminal emulator's current working directory correct,
# even if the current working directory path contains symbolic links
#
# References:
# - Apple's Terminal.app: https://superuser.com/a/315029
# - iTerm2: https://iterm2.com/documentation-escape-codes.html (iTerm2 Extension / CurrentDir+RemoteHost)
# - Konsole: https://bugs.kde.org/show_bug.cgi?id=327720#c1
# - libvte (gnome-terminal, mate-terminal, …): https://bugzilla.gnome.org/show_bug.cgi?id=675987#c14
# Apparently it had a bug before ~2012 were it would display the unknown OSC 7 code
#
# 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.
local URL_HOST URL_PATH
URL_HOST = " $( omz_urlencode -P $HOST ) " || return 1
URL_PATH = " $( omz_urlencode -P $PWD ) " || return 1
# common control sequence (OSC 7) to set current host and path
printf "\e]7;%s\a" " file:// ${ URL_HOST } ${ URL_PATH } "
}
# Use a precmd hook instead of a chpwd hook to avoid contaminating output
# i.e. when a script or function changes directory without `cd -q`, chpwd
# will be called the output may be swallowed by the script or function.
add-zsh-hook precmd omz_termsupport_cwd