From 41bd36261a43db209c3f27486b70360c0d235a2f Mon Sep 17 00:00:00 2001 From: BZ Date: Thu, 18 Feb 2021 20:52:05 +0100 Subject: [PATCH] provide minimal shell configurations --- README.md | 21 +++++-- dynamictitles.bash | 10 ++++ dynamictitles.zsh | 139 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 166 insertions(+), 4 deletions(-) create mode 100644 dynamictitles.bash create mode 100644 dynamictitles.zsh diff --git a/README.md b/README.md index e439a37..ff7fac3 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ How does it work ------------ The plugin sends the correct keypresses based on the focused appplication. In order to differentitate between (n)vim and tmux clients, the title of your terminal is changed. -Therefore your shell/terminal stack has to support dynamic titles. +Therefore your shell/terminal stack has to support dynamic titles (see Troubleshooting section). Installation ------------ @@ -66,8 +66,21 @@ bind -n C-Right if-shell "$is_vim" "send-keys C-l" "run-shell 'sh ~/.config/awes Troubleshooting --------------- - -Most likely your terminal is `xterm` and does not support dynamic titles. - After a correct installation the title of a tmux session should end with "- TMUX" and "- VIM" or "- NVIM" for vim or nvim sessions respectively. You can check the title (property `WM_NAME`) by using `xprop`. + +In case your title does not change, your terminal and/or shell do not support dynamic titles. + +- `xterm` does not support dynamic titles. Time to move on, boomer. +- Your shell is not configured. Try the provided minimal configurations for `zsh` or `bash`: + +``` +echo "source ~/.config/awesome/awesomewm-vim-tmux-navigator/dynamictitles.zsh" >> ~/.zshrc +``` + +or + +``` +echo "source ~/.config/awesome/awesomewm-vim-tmux-navigator/dynamictitles.bash" >> ~/.bashrc +``` + diff --git a/dynamictitles.bash b/dynamictitles.bash new file mode 100644 index 0000000..e0533e3 --- /dev/null +++ b/dynamictitles.bash @@ -0,0 +1,10 @@ +trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG +function show_name(){ + if [[ -n "$BASH_COMMAND" ]]; + then + echo -en "\033]0;`pwd`\007"; + else + echo -en "\033]0;$BASH_COMMAND\007"; + fi +} +export PROMPT_COMMAND='show_name' diff --git a/dynamictitles.zsh b/dynamictitles.zsh new file mode 100644 index 0000000..4007154 --- /dev/null +++ b/dynamictitles.zsh @@ -0,0 +1,139 @@ +# Source: https://github.com/ohmyzsh/ohmyzsh/blob/master/lib/termsupport.zsh + +# 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*|konsole*|ansi) + print -Pn "\e]2;$2:q\a" # set window name + print -Pn "\e]1;$1:q\a" # set tab name + ;; + screen*|tmux*) + 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 { + [[ "$DISABLE_AUTO_TITLE" == true ]] && return + title $ZSH_THEME_TERM_TAB_TITLE_IDLE $ZSH_THEME_TERM_TITLE_IDLE +} + +# Runs before executing the command +function omz_termsupport_preexec { + [[ "$DISABLE_AUTO_TITLE" == true ]] && return + + emulate -L zsh + setopt extended_glob + + # split command into array of arguments + local -a cmdargs + cmdargs=("${(z)2}") + # if running fg, extract the command from the job description + if [[ "${cmdargs[1]}" = fg ]]; then + # get the job id from the first argument passed to the fg command + local job_id jobspec="${cmdargs[2]#%}" + # logic based on jobs arguments: + # http://zsh.sourceforge.net/Doc/Release/Jobs-_0026-Signals.html#Jobs + # https://www.zsh.org/mla/users/2007/msg00704.html + case "$jobspec" in + <->) # %number argument: + # use the same passed as an argument + job_id=${jobspec} ;; + ""|%|+) # empty, %% or %+ argument: + # use the current job, which appears with a + in $jobstates: + # suspended:+:5071=suspended (tty output) + job_id=${(k)jobstates[(r)*:+:*]} ;; + -) # %- argument: + # use the previous job, which appears with a - in $jobstates: + # suspended:-:6493=suspended (signal) + job_id=${(k)jobstates[(r)*:-:*]} ;; + [?]*) # %?string argument: + # use $jobtexts to match for a job whose command *contains* + job_id=${(k)jobtexts[(r)*${(Q)jobspec}*]} ;; + *) # %string argument: + # use $jobtexts to match for a job whose command *starts with* + job_id=${(k)jobtexts[(r)${(Q)jobspec}*]} ;; + esac + + # override preexec function arguments with job command + if [[ -n "${jobtexts[$job_id]}" ]]; then + 1="${jobtexts[$job_id]}" + 2="${jobtexts[$job_id]}" + fi + 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%<<' +} + +autoload -U add-zsh-hook +add-zsh-hook precmd omz_termsupport_precmd +add-zsh-hook preexec omz_termsupport_preexec + + +# Keep Apple Terminal.app's current working directory updated +# Based on this answer: https://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 host and path names. + local URL_HOST URL_PATH + URL_HOST="$(omz_urlencode -P $HOST)" || return 1 + URL_PATH="$(omz_urlencode -P $PWD)" || return 1 + + # Undocumented Terminal.app-specific control sequence + printf '\e]7;%s\a' "file://$URL_HOST$URL_PATH" + } + + # Use a precmd hook instead of a chpwd hook to avoid contaminating output + add-zsh-hook precmd update_terminalapp_cwd + # Run once to get initial cwd set + update_terminalapp_cwd +fi