summaryrefslogtreecommitdiff
path: root/plugins/terminalapp/terminalapp.plugin.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/terminalapp/terminalapp.plugin.zsh')
-rw-r--r--plugins/terminalapp/terminalapp.plugin.zsh42
1 files changed, 35 insertions, 7 deletions
diff --git a/plugins/terminalapp/terminalapp.plugin.zsh b/plugins/terminalapp/terminalapp.plugin.zsh
index 4695ad055..2249b1e2f 100644
--- a/plugins/terminalapp/terminalapp.plugin.zsh
+++ b/plugins/terminalapp/terminalapp.plugin.zsh
@@ -1,11 +1,39 @@
# Set Apple Terminal.app resume directory
# based on this answer: http://superuser.com/a/315029
+# 2012-10-26: (javageek) Changed code using the updated answer
-function chpwd {
- local SEARCH=' '
- local REPLACE='%20'
- local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
- printf '\e]7;%s\a' "$PWD_URL"
-}
+# Tell the terminal about the working directory whenever it changes.
+if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then
+ update_terminal_cwd() {
+ # Identify the directory using a "file:" scheme URL, including
+ # the host name to disambiguate local vs. remote paths.
-chpwd \ No newline at end of file
+ # Percent-encode the pathname.
+ local URL_PATH=''
+ {
+ # Use LANG=C to process text byte-by-byte.
+ local i ch hexch LANG=C
+ for ((i = 1; i <= ${#PWD}; ++i)); do
+ ch="$PWD[i]"
+ if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
+ URL_PATH+="$ch"
+ else
+ hexch=$(printf "%02X" "'$ch")
+ URL_PATH+="%$hexch"
+ fi
+ done
+ }
+
+ local PWD_URL="file://$HOST$URL_PATH"
+ #echo "$PWD_URL" # testing
+ printf '\e]7;%s\a' "$PWD_URL"
+ }
+
+ # Register the function so it is called whenever the working
+ # directory changes.
+ autoload add-zsh-hook
+ add-zsh-hook chpwd update_terminal_cwd
+
+ # Tell the terminal about the initial directory.
+ update_terminal_cwd
+fi