Merge pull request #806 from ZyX-I/shell-fixes

Shell fixes: TMUX support for su[do] and modes on old zsh
This commit is contained in:
ZyX-I 2014-02-15 20:05:41 +03:00
commit 1fbd92bb88
4 changed files with 120 additions and 73 deletions

View File

@ -9,24 +9,35 @@ if test -z "${POWERLINE_COMMAND}" ; then
fi
fi
_powerline_tmux_setenv() {
if [[ -n "$TMUX" ]]; then
tmux setenv -g TMUX_"$1"_`tmux display -p "#D" | tr -d %` "$2"
tmux refresh -S
fi
}
_powerline_init_tmux_support() {
# Note: `test -w ""` returns false, so first condition may be removed
if test -n "$TMUX" && test -w "$TMUX" ; then
# TMUX variable may be unset to create new tmux session inside this one
_POWERLINE_TMUX="$TMUX"
_POWERLINE_SAVED_PWD=
_powerline_tmux_setenv() {
TMUX="$_POWERLINE_TMUX" tmux setenv -g TMUX_"$1"_`tmux display -p "#D" | tr -d %` "$2"
TMUX="$_POWERLINE_TMUX" tmux refresh -S
}
_powerline_tmux_set_pwd() {
_powerline_tmux_set_pwd() {
if test "x$_POWERLINE_SAVED_PWD" != "x$PWD" ; then
_POWERLINE_SAVED_PWD="$PWD"
_powerline_tmux_setenv PWD "$PWD"
fi
}
}
_powerline_tmux_set_columns() {
_powerline_tmux_set_columns() {
_powerline_tmux_setenv COLUMNS "$COLUMNS"
}
trap "_powerline_tmux_set_columns" SIGWINCH
_powerline_tmux_set_columns
else
_powerline_tmux_set_pwd() {
return 0
}
fi
}
_powerline_prompt() {
@ -36,8 +47,7 @@ _powerline_prompt() {
return $last_exit_code
}
trap "_powerline_tmux_set_columns" SIGWINCH
_powerline_tmux_set_columns
[[ "$PROMPT_COMMAND" != "${PROMPT_COMMAND/_powerline_prompt/}" ]] ||
export PROMPT_COMMAND="${PROMPT_COMMAND}"$'\n'"_powerline_prompt"
_powerline_init_tmux_support

View File

@ -2,8 +2,10 @@ function powerline-setup
if test -z "$POWERLINE_COMMAND"
if which powerline-client >/dev/null
set -g -x POWERLINE_COMMAND powerline-client
else
else if which powerline >/dev/null
set -g -x POWERLINE_COMMAND powerline
else
set -g -x POWERLINE_COMMAND (dirname (status -f))/../../../scripts/powerline
end
end
function --on-variable POWERLINE_COMMAND _powerline_update
@ -18,12 +20,11 @@ function powerline-setup
"
end
_powerline_update
if test -w "$TMUX"
function _powerline_tmux_setenv
if test -n "$TMUX"
tmux setenv -g TMUX_$argv[1]_(tmux display -p "#D" | tr -d "%") "$argv[2]"
tmux refresh -S
end
end
function --on-variable PWD _powerline_tmux_set_pwd
_powerline_tmux_setenv PWD "$PWD"
end
@ -32,4 +33,5 @@ function powerline-setup
end
_powerline_tmux_set_columns
_powerline_tmux_set_pwd
end
end

View File

@ -14,7 +14,7 @@ if ! $?POWERLINE_COMMAND then
setenv POWERLINE_COMMAND $POWERLINE_SOURCED:h:h:h:h:q/scripts/powerline
endif
endif
alias _powerline_tmux_set_pwd 'if $?TMUX tmux setenv -g TMUX_PWD_`tmux display -p "#D" | tr -d %` $PWD:q ; if $?TMUX tmux refresh -S'
alias _powerline_tmux_set_pwd 'if ( $?TMUX && { test -w $TMUX:q } ) tmux setenv -g TMUX_PWD_`tmux display -p "#D" | tr -d %` $PWD:q ; if ( $?TMUX && { test -w $TMUX:q } ) tmux refresh -S'
alias _powerline_set_prompt 'set prompt="`$POWERLINE_COMMAND shell left -r tcsh_prompt --last_exit_code=$?`"'
alias _powerline_set_rprompt 'set rprompt="`$POWERLINE_COMMAND shell right -r tcsh_prompt --last_exit_code=$?` "'
alias cwdcmd "`alias cwdcmd` ; _powerline_tmux_set_pwd"

View File

@ -8,23 +8,84 @@ if test -z "${POWERLINE_COMMAND}" ; then
fi
fi
_powerline_tmux_setenv() {
integer _POWERLINE_JOBNUM
_powerline_init_tmux_support() {
emulate -L zsh
if [[ -n "$TMUX" ]]; then
# Note: `test -w ""` returns false, so first condition may be removed
if test -n "$TMUX" && test -w "$TMUX" ; then
# TMUX variable may be unset to create new tmux session inside this one
typeset -g _POWERLINE_TMUX="$TMUX"
function -g _powerline_tmux_setenv() {
emulate -L zsh
local -x TMUX="$_POWERLINE_TMUX"
tmux setenv -g TMUX_"$1"_$(tmux display -p "#D" | tr -d %) "$2"
tmux refresh -S
}
function -g _powerline_tmux_set_pwd() {
_powerline_tmux_setenv PWD "$PWD"
}
function -g _powerline_tmux_set_columns() {
_powerline_tmux_setenv COLUMNS "$COLUMNS"
}
chpwd_functions+=( _powerline_tmux_set_pwd )
trap "_powerline_tmux_set_columns" SIGWINCH
_powerline_tmux_set_columns
_powerline_tmux_set_pwd
fi
}
_powerline_tmux_set_pwd() {
_powerline_tmux_setenv PWD "$PWD"
_powerline_init_modes_support() {
emulate -L zsh
test -z "$ZSH_VERSION" && return 0
typeset -ga VS
VS=( ${(s:.:)ZSH_VERSION} )
# Mode support requires >=zsh-4.3.11
if (( VS[1] < 4 || (VS[1] == 4 && (VS[2] < 3 || (VS[2] == 3 && VS[3] < 11))) )) ; then
return 0
fi
function -g _powerline_get_main_keymap_name() {
REPLY="${${(Q)${${(z)${"$(bindkey -lL main)"}}[3]}}:-.safe}"
}
function -g _powerline_set_true_keymap_name() {
export _POWERLINE_MODE="${1}"
local plm_bk="$(bindkey -lL ${_POWERLINE_MODE})"
if [[ $plm_bk = 'bindkey -A'* ]] ; then
_powerline_set_true_keymap_name ${(Q)${${(z)plm_bk}[3]}}
fi
}
function -g _powerline_zle_keymap_select() {
_powerline_set_true_keymap_name $KEYMAP
zle reset-prompt
test -z "$_POWERLINE_SAVE_WIDGET" || zle $_POWERLINE_SAVE_WIDGET
}
function -g _powerline_set_main_keymap_name() {
local REPLY
_powerline_get_main_keymap_name
_powerline_set_true_keymap_name "$REPLY"
}
if [[ "$_POWERLINE_MODE" != vi* ]] ; then
export _POWERLINE_DEFAULT_MODE="$_POWERLINE_MODE"
fi
_powerline_add_widget zle-keymap-select _powerline_zle_keymap_select
_powerline_set_main_keymap_name
precmd_functions+=( _powerline_set_main_keymap_name )
}
_powerline_tmux_set_columns() {
_powerline_tmux_setenv COLUMNS "$COLUMNS"
}
_powerline_precmd() {
_powerline_set_jobnum() {
# If you are wondering why I am not using the same code as I use for bash
# ($(jobs|wc -l)): consider the following test:
# echo abc | less
@ -36,19 +97,16 @@ _powerline_precmd() {
# wrong number of jobs. You need to filter the lines first. Or not use
# jobs built-in at all.
_POWERLINE_JOBNUM=${(%):-%j}
_powerline_set_true_keymap_name "${${(Q)${${(z)${"$(bindkey -lL main)"}}[3]}}:-.safe}"
}
_powerline_setup_prompt() {
emulate -L zsh
for f in "${precmd_functions[@]}"; do
if [[ "$f" = "_powerline_precmd" ]]; then
if [[ "$f" = "_powerline_set_jobnum" ]]; then
return
fi
done
precmd_functions+=( _powerline_precmd )
chpwd_functions+=( _powerline_tmux_set_pwd )
_powerline_set_true_keymap_name "${${(Q)${${(z)${"$(bindkey -lL main)"}}[3]}}:-.safe}"
precmd_functions+=( _powerline_set_jobnum )
if zmodload zsh/zpython &>/dev/null ; then
zpython 'from powerline.bindings.zsh import setup as _powerline_setup'
zpython '_powerline_setup()'
@ -85,31 +143,8 @@ _powerline_add_widget() {
fi
}
_powerline_set_true_keymap_name() {
export _POWERLINE_MODE="${1}"
local plm_bk="$(bindkey -lL ${_POWERLINE_MODE})"
if [[ $plm_bk = 'bindkey -A'* ]] ; then
_powerline_set_true_keymap_name ${(Q)${${(z)plm_bk}[3]}}
fi
}
_powerline_zle_keymap_select() {
_powerline_set_true_keymap_name $KEYMAP
zle reset-prompt
test -z "$_POWERLINE_SAVE_WIDGET" || zle $_POWERLINE_SAVE_WIDGET
}
_powerline_add_widget zle-keymap-select _powerline_zle_keymap_select
_powerline_precmd
if [[ "$_POWERLINE_MODE" != vi* ]] ; then
export _POWERLINE_DEFAULT_MODE="$_POWERLINE_MODE"
fi
trap "_powerline_tmux_set_columns" SIGWINCH
_powerline_tmux_set_columns
_powerline_tmux_set_pwd
setopt promptpercent
setopt promptsubst
_powerline_setup_prompt
_powerline_init_tmux_support
_powerline_init_modes_support