diff --git a/.gitignore b/.gitignore index 51a5ee6c3..e043d2706 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ custom/* *.swp !custom/example.zshcache cache/ +*~ diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index 80319e1a8..1c8865a9c 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -3,33 +3,56 @@ #Fully support screen, iterm, and probably most modern xterm and rxvt #Limited support for Apple Terminal (Terminal can't set window or tab separately) function title { - if [[ "$DISABLE_AUTO_TITLE" == "true" ]] || [[ "$EMACS" == *term* ]]; then - return - fi - if [[ "$TERM" == screen* ]]; then - print -Pn "\ek$1:q\e\\" #set screen hardstatus, usually truncated at 20 chars - elif [[ "$TERM" == xterm* ]] || [[ $TERM == rxvt* ]] || [[ $TERM == ansi ]] || [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then - print -Pn "\e]2;$2:q\a" #set window name - print -Pn "\e]1;$1:q\a" #set icon (=tab) name (will override window name on broken terminal) - fi + if [[ "$DISABLE_AUTO_TITLE" == "true" ]] || [[ "$EMACS" == *term* ]]; then + return + fi + if [[ "$TERM" == screen* ]]; then + print -Pn "\ek$1:q\e\\" #set screen hardstatus, usually truncated at 20 chars + elif [[ "$TERM" == xterm* ]] || [[ $TERM == rxvt* ]] || [[ $TERM == ansi ]] || [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then + # print -r "$2:q" 1>&2 + # print -r "$1:q" 1>&2 + print -Pn "\e]2;$2:q\a" #set window name + print -Pn "\e]1;$1:q\a" #set icon (=tab) name (will override window name on broken terminal) + fi } ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD -ZSH_THEME_TERM_TITLE_IDLE="%n@%m: %~" +ZSH_THEME_TERM_TITLE_IDLE="%a@%m: %~" #Appears when you have the prompt function omz_termsupport_precmd { - title $ZSH_THEME_TERM_TAB_TITLE_IDLE $ZSH_THEME_TERM_TITLE_IDLE + title $ZSH_THEME_TERM_TAB_TITLE_IDLE $ZSH_THEME_TERM_TITLE_IDLE } #Appears at the beginning of (and during) of command execution function omz_termsupport_preexec { - emulate -L zsh - setopt extended_glob - local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd - local LINE="${2:gs/$/\\$}" - LINE="${LINE:gs/%/%%}" - title "$CMD" "%100>...>$LINE%<<" + emulate -L zsh + setopt extended_glob + local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd + CMD=${CMD:gs/\\/\\\\} # escapses \ -- must be first + local LINE=${2:gs/\\/\\\\} # escapes \ -- must be first + + if [[ -o PROMPT_BANG ]]; then + # We must escape ! so that it is not interpreted as a history event number + LINE=${LINE:gs/\!/\!\!} + CMD=${CMD:gs/\!/\!\!} + fi + + if [[ -o PROMPT_SUBST ]]; then + # We must escape $ and `, as both initiate command substitution and + # the former also initiates arithmetic and parameter expansion + CMD=${CMD:gs/$/\\$} + CMD=${CMD:gs/\`/\\\`} + LINE=${LINE:gs/$/\\$} + LINE=${LINE:gs/\`/\\\`} + fi + + if [[ -o PROMPT_PERCENT ]]; then + # We must escape % so that it is not interpreted as starting an escape sequence + CMD=${CMD:gs/%/%%} + LINE=${LINE:gs/%/%%} + fi + title "${CMD}" "%100>...>${LINE}%<<" } autoload -U add-zsh-hook