From 5b4dcea595371bcf9c1018156c4a085d67c9b929 Mon Sep 17 00:00:00 2001 From: Sorin Ionescu Date: Tue, 27 Aug 2013 15:53:49 -0400 Subject: [PATCH] Simplify auto-titling --- modules/helper/README.md | 2 - modules/helper/init.zsh | 5 --- modules/terminal/README.md | 22 ++++------ modules/terminal/init.zsh | 86 +++++++++++++------------------------- runcoms/zpreztorc | 7 +--- 5 files changed, 39 insertions(+), 83 deletions(-) diff --git a/modules/helper/README.md b/modules/helper/README.md index 7cafc2c..b010b00 100644 --- a/modules/helper/README.md +++ b/modules/helper/README.md @@ -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. diff --git a/modules/helper/init.zsh b/modules/helper/init.zsh index b7a89ae..7e0f9d5 100644 --- a/modules/helper/init.zsh +++ b/modules/helper/init.zsh @@ -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 diff --git a/modules/terminal/README.md b/modules/terminal/README.md index c1158b1..76ce1c7 100644 --- a/modules/terminal/README.md +++ b/modules/terminal/README.md @@ -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 diff --git a/modules/terminal/init.zsh b/modules/terminal/init.zsh index 8c46eb0..b722a67 100644 --- a/modules/terminal/init.zsh +++ b/modules/terminal/init.zsh @@ -2,82 +2,60 @@ # Sets terminal window and tab titles. # # Authors: -# James Cox # Sorin Ionescu # -# 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 diff --git a/runcoms/zpreztorc b/runcoms/zpreztorc index 0fde4bd..b045cab 100644 --- a/runcoms/zpreztorc +++ b/runcoms/zpreztorc @@ -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