|
@@ -55,35 +55,58 @@ preexec_functions+=(omz_termsupport_preexec)
|
|
|
|
|
|
# Keep Apple Terminal.app's current working directory updated
|
|
# Keep Apple Terminal.app's current working directory updated
|
|
# Based on this answer: http://superuser.com/a/315029
|
|
# Based on this answer: http://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
|
|
if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then
|
|
- # Emits the control sequence to notify Terminal.app of the cwd
|
|
+
|
|
- function update_terminalapp_cwd() {
|
|
+ # URL-encodes a string
|
|
- # Identify the directory using a "file:" scheme URL, including
|
|
+ # Outputs the encoded string on stdout
|
|
- # the host name to disambiguate local vs. remote paths.
|
|
+ # Returns nonzero if encoding failed
|
|
-
|
|
+ function _omz_urlencode() {
|
|
- # Percent-encode the pathname.
|
|
+ local url_str=''
|
|
- local URL_PATH=''
|
|
+ {
|
|
- {
|
|
+ local str=$1
|
|
- # Use LC_CTYPE=C to process text byte-by-byte.
|
|
+
|
|
- local i ch hexch LC_CTYPE=C
|
|
+ # URLs must use UTF-8 encoding; convert if required
|
|
- for ((i = 1; i <= ${#PWD}; ++i)); do
|
|
+ local encoding=${LC_CTYPE/*./}
|
|
- ch="$PWD[i]"
|
|
+ if [[ $encoding != UTF-8 ]]; then
|
|
- if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
|
|
+ str=$(iconv -f $encoding -t UTF-8)
|
|
- URL_PATH+="$ch"
|
|
+ if [[ $? != 0 ]]; then
|
|
- else
|
|
+ echo "Error converting string from $encoding to UTF-8" >&2
|
|
- hexch=$(printf "%02X" "'$ch")
|
|
+ return 1
|
|
- URL_PATH+="%$hexch"
|
|
+ fi
|
|
- fi
|
|
+ fi
|
|
- done
|
|
+
|
|
- }
|
|
+ # Use LC_CTYPE=C to process text byte-by-byte
|
|
-
|
|
+ local i ch hexch LC_CTYPE=C
|
|
- local PWD_URL="file://$HOST$URL_PATH"
|
|
+ for ((i = 1; i <= ${#str}; ++i)); do
|
|
- printf '\e]7;%s\a' "$PWD_URL"
|
|
+ ch="$str[i]"
|
|
|
|
+ if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
|
|
|
|
+ url_str+="$ch"
|
|
|
|
+ else
|
|
|
|
+ hexch=$(printf "%02X" "'$ch")
|
|
|
|
+ url_str+="%$hexch"
|
|
|
|
+ fi
|
|
|
|
+ done
|
|
|
|
+ echo $url_str
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
|
|
- # Use a precmd hook instead of a chpwd hook to avoid contaminating output
|
|
+ # Emits the control sequence to notify Terminal.app of the cwd
|
|
- precmd_functions+=(update_terminalapp_cwd)
|
|
+ function update_terminalapp_cwd() {
|
|
- # Run once to get initial cwd set
|
|
+ # Identify the directory using a "file:" scheme URL, including
|
|
- update_terminalapp_cwd
|
|
+ # the host name to disambiguate local vs. remote paths.
|
|
|
|
+
|
|
|
|
+ # Percent-encode the pathname.
|
|
|
|
+ local URL_PATH=$(_omz_urlencode $PWD)
|
|
|
|
+ [[ $? != 0 ]] && return 1
|
|
|
|
+ local PWD_URL="file://$HOST$URL_PATH"
|
|
|
|
+ # Undocumented Terminal.app-specific control sequence
|
|
|
|
+ printf '\e]7;%s\a' $PWD_URL
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ # Use a precmd hook instead of a chpwd hook to avoid contaminating output
|
|
|
|
+ precmd_functions+=(update_terminalapp_cwd)
|
|
|
|
+ # Run once to get initial cwd set
|
|
|
|
+ update_terminalapp_cwd
|
|
fi
|
|
fi
|