|
@@ -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
|