summaryrefslogtreecommitdiff
path: root/lib/termsupport.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'lib/termsupport.zsh')
-rw-r--r--lib/termsupport.zsh77
1 files changed, 52 insertions, 25 deletions
diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh
index 80ca7ef78..d170ffcbf 100644
--- a/lib/termsupport.zsh
+++ b/lib/termsupport.zsh
@@ -17,7 +17,7 @@ function title {
: ${2=$1}
case "$TERM" in
- cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|st*|foot)
+ cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|st*|foot*|contour*)
print -Pn "\e]2;${2:q}\a" # set window name
print -Pn "\e]1;${1:q}\a" # set tab name
;;
@@ -109,28 +109,55 @@ 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 or in an SSH session (#11696)
+if [[ -n "$INSIDE_EMACS" || -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; 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
+
+ # Konsole errors if the HOST is provided
+ [[ -z "$KONSOLE_PROFILE_NAME" && -z "$KONSOLE_DBUS_SESSION" ]] || URL_HOST=""
+
+ # common control sequence (OSC 7) to set current host and path
+ printf "\e]7;file://%s%s\e\\" "${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