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 - `is-autoloadable` checks if a file can be autoloaded by trying to load it
in a subshell. in a subshell.
- `is-callable` checks if a name is a command, function, or alias. - `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". - `is-true` checks a boolean variable for "true".
- `coalesce` prints the first non-empty string in the arguments array. - `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]|)) ]] [[ -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. # Prints the first non-empty string in the arguments array.
function coalesce { function coalesce {
for arg in $argv; do for arg in $argv; do

View File

@ -8,32 +8,26 @@ Settings
### Auto-Title ### Auto-Title
To auto set the terminal emulator window and tab titles with the current command To auto set the terminal window and tab titles with the current command or
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
directory, add the following to *zpreztorc*: 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 Functions
--------- ---------
- `set-screen-window-title` sets the screen title. - `set-tab-title` sets the terminal tab title.
- `set-terminal-tab-title` sets the terminal tab title. - `set-window-title` sets the terminal or terminal multiplexer window 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.
Authors Authors
------- -------
*The authors of this module should be contacted via the [issue tracker][1].* *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) - [Sorin Ionescu](https://github.com/sorin-ionescu)
[1]: https://github.com/sorin-ionescu/prezto/issues [1]: https://github.com/sorin-ionescu/prezto/issues

View File

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

View File

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