mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2024-11-15 18:30:08 +00:00
d779750341
Currently, the title is only set on supported terminals (i.e. xterm, urxvt, screen etc.). Using terminfo entries to set the terminal title adds support for many more terminals.
105 lines
3 KiB
Bash
105 lines
3 KiB
Bash
# 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)
|
|
function title {
|
|
emulate -L zsh
|
|
setopt prompt_subst
|
|
|
|
[[ "$EMACS" == *term* ]] && return
|
|
|
|
# if $2 is unset use $1 as default
|
|
# if it is set and empty, leave it as is
|
|
: ${2=$1}
|
|
|
|
case "$TERM" in
|
|
cygwin|xterm*|putty*|rxvt*|ansi)
|
|
print -Pn "\e]2;$2:q\a" # set window name
|
|
print -Pn "\e]1;$1:q\a" # set tab name
|
|
;;
|
|
screen*)
|
|
print -Pn "\ek$1:q\e\\" # set screen hardstatus
|
|
;;
|
|
*)
|
|
if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then
|
|
print -Pn "\e]2;$2:q\a" # set window name
|
|
print -Pn "\e]1;$1:q\a" # set tab name
|
|
else
|
|
# Try to use terminfo to set the title
|
|
# If the feature is available set title
|
|
if [[ -n "$terminfo[fsl]" ]] && [[ -n "$terminfo[tsl]" ]]; then
|
|
echoti tsl
|
|
print -Pn "$1"
|
|
echoti fsl
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
}
|
|
|
|
ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD
|
|
ZSH_THEME_TERM_TITLE_IDLE="%n@%m: %~"
|
|
# Avoid duplication of directory in terminals with independent dir display
|
|
if [[ "$TERM_PROGRAM" == Apple_Terminal ]]; then
|
|
ZSH_THEME_TERM_TITLE_IDLE="%n@%m"
|
|
fi
|
|
|
|
# Runs before showing the prompt
|
|
function omz_termsupport_precmd {
|
|
emulate -L zsh
|
|
|
|
if [[ "$DISABLE_AUTO_TITLE" == true ]]; then
|
|
return
|
|
fi
|
|
|
|
title $ZSH_THEME_TERM_TAB_TITLE_IDLE $ZSH_THEME_TERM_TITLE_IDLE
|
|
}
|
|
|
|
# Runs before executing the command
|
|
function omz_termsupport_preexec {
|
|
emulate -L zsh
|
|
setopt extended_glob
|
|
|
|
if [[ "$DISABLE_AUTO_TITLE" == true ]]; then
|
|
return
|
|
fi
|
|
|
|
# cmd name only, or if this is sudo or ssh, the next cmd
|
|
local CMD=${1[(wr)^(*=*|sudo|ssh|mosh|rake|-*)]:gs/%/%%}
|
|
local LINE="${2:gs/%/%%}"
|
|
|
|
title '$CMD' '%100>...>$LINE%<<'
|
|
}
|
|
|
|
precmd_functions+=(omz_termsupport_precmd)
|
|
preexec_functions+=(omz_termsupport_preexec)
|
|
|
|
|
|
# Keep Apple Terminal.app's current working directory updated
|
|
# 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
|
|
# 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 pathname.
|
|
local URL_PATH="$(omz_urlencode -P $PWD)"
|
|
[[ $? != 0 ]] && return 1
|
|
|
|
# Undocumented Terminal.app-specific control sequence
|
|
printf '\e]7;%s\a' "file://$HOST$URL_PATH"
|
|
}
|
|
|
|
# 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
|