termsupport.zsh 3.32 KB
Newer Older
1
2
3
4
5
6
7
8
# Set terminal window and tab/icon title
#
# usage: title short_tab_title [long_window_title]
#
# See: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#ss3.1
# Fully supports screen, iterm, and probably most modern xterm and rxvt
# (In screen, only short_tab_title is used)
# Limited support for Apple Terminal (Terminal can't set window and tab separately)
9
function title {
Marc Cornellà's avatar
Marc Cornellà committed
10
11
12
13
14
15
  [[ "$EMACS" == *term* ]] && return

  # if $2 is unset use $1 as default
  # if it is set and empty, leave it as is
  : ${2=$1}

16
  if [[ "$TERM" == screen* ]]; then
17
    print -Pn "\ek$1:q\e\\" #set screen hardstatus, usually truncated at 20 chars
18
  elif [[ "$TERM" == xterm* ]] || [[ "$TERM" == rxvt* ]] || [[ "$TERM" == ansi ]] || [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then
19
    print -Pn "\e]2;$2:q\a" #set window name
20
    print -Pn "\e]1;$1:q\a" #set icon (=tab) name
21
22
23
24
25
26
  fi
}

ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD
ZSH_THEME_TERM_TITLE_IDLE="%n@%m: %~"

27
# Runs before showing the prompt
28
function omz_termsupport_precmd {
29
30
31
32
  if [[ $DISABLE_AUTO_TITLE == true ]]; then
    return
  fi

33
  title $ZSH_THEME_TERM_TAB_TITLE_IDLE $ZSH_THEME_TERM_TITLE_IDLE
34
35
}

36
# Runs before executing the command
37
function omz_termsupport_preexec {
38
39
40
41
  if [[ $DISABLE_AUTO_TITLE == true ]]; then
    return
  fi

42
43
  emulate -L zsh
  setopt extended_glob
Marc Cornellà's avatar
Marc Cornellà committed
44
45
46

  # cmd name only, or if this is sudo or ssh, the next cmd
  local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]:gs/%/%%}
47
  local LINE="${2:gs/%/%%}"
Marc Cornellà's avatar
Marc Cornellà committed
48

49
  title '$CMD' '%100>...>$LINE%<<'
50
}
51

Jingwen Owen Ou's avatar
Jingwen Owen Ou committed
52
53
precmd_functions+=(omz_termsupport_precmd)
preexec_functions+=(omz_termsupport_preexec)
54
55


56
57
# Keep Apple Terminal.app's current working directory updated
# Based on this answer: http://superuser.com/a/315029
58
# With extra fixes to handle multibyte chars and non-UTF-8 locales
59
60

if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

  # URL-encodes a string
  # Outputs the encoded string on stdout
  # Returns nonzero if encoding failed
  function _omz_urlencode() {
    local url_str=''
    {
      local str=$1

      # URLs must use UTF-8 encoding; convert if required
      local encoding=${LC_CTYPE/*./}
      if [[ $encoding != UTF-8 ]]; then
        str=$(iconv -f $encoding -t UTF-8)
        if [[ $? != 0 ]]; then
          echo "Error converting string from $encoding to UTF-8" >&2
          return 1
        fi
      fi

      # Use LC_CTYPE=C to process text byte-by-byte
      local i ch hexch LC_CTYPE=C
      for ((i = 1; i <= ${#str}; ++i)); do
        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
92
    }
93
  }
94

95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  # Emits the control sequence to notify Terminal.app of the cwd
  function update_terminalapp_cwd() {
    # Identify the directory using a "file:" scheme URL, including
    # 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
112
fi