Simplify auto-titling

This commit is contained in:
Sorin Ionescu 2013-08-27 15:53:49 -04:00
parent b98c7469e5
commit 5b4dcea595
5 changed files with 39 additions and 83 deletions

View File

@ -11,8 +11,6 @@ Functions
- `is-autoloadable` checks if a file can be autoloaded by trying to load it
in a subshell.
- `is-callable` checks if a name is a command, function, or alias.
- `is-terminal-inside-multiplexer` checks if the currently running terminal is
inside a terminal multiplexer.
- `is-true` checks a boolean variable for "true".
- `coalesce` prints the first non-empty string in the arguments array.

View File

@ -21,11 +21,6 @@ function is-true {
[[ -n "$1" && "$1" == (1|[Yy]([Ee][Ss]|)|[Tt]([Rr][Uu][Ee]|)|[Oo]([Nn]|)) ]]
}
# Checks if the currently running terminal is inside a terminal multiplexer.
function is-terminal-inside-multiplexer {
[[ -n "$STY" || -n "$TMUX" || -n "$DVTM" ]]
}
# Prints the first non-empty string in the arguments array.
function coalesce {
for arg in $argv; do

View File

@ -8,32 +8,26 @@ Settings
### Auto-Title
To auto set the terminal emulator window and tab titles with the current command
or directory, add the following to *zpreztorc*:
zstyle ':prezto:module:terminal:auto-title' emulator 'yes'
To auto set the terminal multiplexer window title with the current command or
To auto set the terminal window and tab titles with the current command or
directory, add the following to *zpreztorc*:
zstyle ':prezto:module:terminal:auto-title' multiplexer 'yes'
zstyle ':prezto:module:terminal' auto-title 'yes'
Auto titling is disabled inside terminal multiplexers, except inside dvtm, since
it interferes with window names defined in configuration files and profile
managers.
Functions
---------
- `set-screen-window-title` sets the screen title.
- `set-terminal-tab-title` sets the terminal tab title.
- `set-terminal-window-title` sets the terminal window title.
- `set-titles-with-command` sets the screen and terminal titles with
a given command.
- `set-titles-with-path` sets the screen and terminal titles with a given path.
- `set-tab-title` sets the terminal tab title.
- `set-window-title` sets the terminal or terminal multiplexer window title.
Authors
-------
*The authors of this module should be contacted via the [issue tracker][1].*
- [James Cox](https://github.com/imajes)
- [Sorin Ionescu](https://github.com/sorin-ionescu)
[1]: https://github.com/sorin-ionescu/prezto/issues

View File

@ -2,82 +2,60 @@
# Sets terminal window and tab titles.
#
# Authors:
# James Cox <james@imaj.es>
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
# Load dependencies.
pmodload 'helper'
# Return if requirements are not found.
if [[ "$TERM" == 'dumb' ]]; then
return 1
fi
# Sets the GNU Screen title.
function set-screen-window-title {
# Sets the terminal or terminal multiplexer window title.
function set-window-title {
if [[ "$TERM" == screen* ]]; then
printf "\ek%s\e\\" ${(V)argv}
fi
}
# Sets the terminal window title.
function set-terminal-window-title {
if [[ "$TERM" == ((x|a|ml|dt|E)term*|(u|)rxvt*|dvtm*) ]]; then
else
printf "\e]2;%s\a" ${(V)argv}
fi
}
# Sets the terminal tab title.
function set-terminal-tab-title {
if [[ "$TERM" == ((x|a|ml|dt|E)term*|(u|)rxvt*|dvtm*) ]]; then
printf "\e]1;%s\a" ${(V)argv}
fi
}
# Sets the Terminal.app current working directory.
function set-terminal-app-cwd {
if [[ "$TERM_PROGRAM" == 'Apple_Terminal' ]]; then
printf '\e]7;%s\a' "file://$HOST${${1:-$PWD}// /%20}"
fi
function set-tab-title {
printf "\e]1;%s\a" ${(V)argv}
}
# Sets the tab and window titles with a given command.
function set-titles-with-command {
function set-titles-with-command-preexec {
emulate -L zsh
setopt EXTENDED_GLOB
# Get the command name that is under job control.
if [[ "${1[(w)1]}" == (fg|%*)(\;|) ]]; then
if [[ "${2[(w)1]}" == (fg|%*)(\;|) ]]; then
# Get the job name, and, if missing, set it to the default %+.
local job_name="${${1[(wr)%*(\;|)]}:-%+}"
local job_name="${${2[(wr)%*(\;|)]}:-%+}"
# Make a local copy for use in the subshell.
local -A jobtexts_from_parent_shell
jobtexts_from_parent_shell=(${(kv)jobtexts})
jobs $job_name 2>/dev/null > >(
jobs "$job_name" 2>/dev/null > >(
read index discarded
# The index is already surrounded by brackets: [1].
set-titles-with-command "${(e):-\$jobtexts_from_parent_shell$index}"
)
else
# Set the command name, or in the case of sudo or ssh, the next command.
local cmd=${${1[(wr)^(*=*|sudo|ssh|-*)]}:t}
local cmd="${${2[(wr)^(*=*|sudo|ssh|-*)]}:t}"
local truncated_cmd="${cmd/(#m)?(#c15,)/${MATCH[1,12]}...}"
unset MATCH
if [[ "$TERM" == screen* ]]; then
set-screen-window-title "$truncated_cmd"
else
set-terminal-window-title "$cmd"
set-terminal-tab-title "$truncated_cmd"
fi
set-window-title "$cmd"
set-tab-title "$truncated_cmd"
fi
}
# Sets the tab and window titles with a given path.
function set-titles-with-path {
function set-titles-with-path-precmd {
emulate -L zsh
setopt EXTENDED_GLOB
@ -86,12 +64,13 @@ function set-titles-with-path {
local truncated_path="${abbreviated_path/(#m)?(#c15,)/...${MATCH[-12,-1]}}"
unset MATCH
if [[ "$TERM" == screen* ]]; then
set-screen-window-title "$truncated_path"
else
set-terminal-window-title "$abbreviated_path"
set-terminal-tab-title "$truncated_path"
fi
set-window-title "$abbreviated_path"
set-tab-title "$truncated_path"
}
# Sets the Terminal.app proxy icon.
function set-terminal-app-proxy-icon-precmd {
printf '\e]7;%s\a' "file://$HOST${${1:-$PWD}// /%20}"
}
# Do not override precmd/preexec; append to the hook array.
@ -99,44 +78,37 @@ autoload -Uz add-zsh-hook
# Set up the Apple Terminal.
if [[ "$TERM_PROGRAM" == 'Apple_Terminal' ]] \
&& (( ${${OSTYPE#darwin}[1,2]} >= 11 )) \
&& ! is-terminal-inside-multiplexer
&& ( ! [[ -n "$STY" || -n "$TMUX" || -n "$DVTM" ]] )
then
# Sets the Terminal.app current working directory before the prompt is
# displayed.
add-zsh-hook precmd set-terminal-app-cwd
add-zsh-hook precmd set-terminal-app-proxy-icon-precmd
# Unsets the Terminal.app current working directory when a terminal
# multiplexer or remote connection is started since it can no longer be
# updated, and it becomes confusing when the directory displayed in the title
# bar is no longer synchronized with real current working directory.
function unset-terminal-app-cwd {
function unset-terminal-app-proxy-icon-preexec {
if [[ "${2[(w)1]:t}" == (screen|tmux|dvtm|ssh|mosh) ]]; then
set-terminal-app-cwd ' '
set-terminal-app-proxy-icon-precmd ' '
fi
}
add-zsh-hook preexec unset-terminal-app-cwd
add-zsh-hook preexec unset-terminal-app-cwd-preexec
# Do not set the tab and window titles in Terminal.app since it sets the tab
# title to the currently running process by default and the current working
# directory is set separately, but do set the tab and window titles inside
# terminal multiplexers inside Terminal.app.
# directory is set separately.
return
fi
# Set up non-Apple terminals.
if ( ( ! is-terminal-inside-multiplexer || [[ -n "$DVTM" ]] ) \
&& zstyle -t ':prezto:module:terminal:auto-title' emulator ) \
|| ( is-terminal-inside-multiplexer \
&& zstyle -t ':prezto:module:terminal:auto-title' multiplexer )
if zstyle -t ':prezto:module:terminal' auto-title \
&& ( ! [[ -n "$STY" || -n "$TMUX" ]] )
then
# Sets the tab and window titles before the prompt is displayed.
add-zsh-hook precmd set-titles-with-path
add-zsh-hook precmd set-titles-with-path-precmd
# Sets the tab and window titles before command execution.
function set-titles-with-command-preexec {
set-titles-with-command "$2"
}
add-zsh-hook preexec set-titles-with-command-preexec
fi

View File

@ -127,11 +127,8 @@ zstyle ':prezto:module:prompt' theme 'sorin'
# Terminal
#
# Auto set the terminal emulator tab and window titles.
zstyle ':prezto:module:terminal:auto-title' emulator 'yes'
# Auto set the terminal multiplexer window title.
zstyle ':prezto:module:terminal:auto-title' multiplexer 'no'
# Auto set the tab and window titles.
# zstyle ':prezto:module:terminal' auto-title 'yes'
#
# Tmux