From 4e6cd08078b8cde17372d49bcc3147e4e67b4b3d Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 15 Feb 2014 20:10:07 +0400 Subject: [PATCH 1/3] In fish also check for presence of powerline in $PATH --- powerline/bindings/fish/powerline-setup.fish | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/powerline/bindings/fish/powerline-setup.fish b/powerline/bindings/fish/powerline-setup.fish index e4dc1ace..ee90c9fd 100644 --- a/powerline/bindings/fish/powerline-setup.fish +++ b/powerline/bindings/fish/powerline-setup.fish @@ -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 From 6c1571139f416af85c824c1f45a483bfb3580b44 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 15 Feb 2014 20:21:09 +0400 Subject: [PATCH 2/3] Check for TMUX only once, check whether $TMUX is writeable Fixes #801 --- powerline/bindings/bash/powerline.sh | 50 ++++++++++++-------- powerline/bindings/fish/powerline-setup.fish | 20 ++++---- powerline/bindings/tcsh/powerline.tcsh | 2 +- powerline/bindings/zsh/powerline.zsh | 45 +++++++++++------- 4 files changed, 69 insertions(+), 48 deletions(-) diff --git a/powerline/bindings/bash/powerline.sh b/powerline/bindings/bash/powerline.sh index e5295ab3..ca9e1792 100644 --- a/powerline/bindings/bash/powerline.sh +++ b/powerline/bindings/bash/powerline.sh @@ -9,26 +9,37 @@ 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 +_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_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() { + 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_setenv COLUMNS "$COLUMNS" + } + + trap "_powerline_tmux_set_columns" SIGWINCH + _powerline_tmux_set_columns + else + _powerline_tmux_set_pwd() { + return 0 + } fi } -_POWERLINE_SAVED_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_setenv COLUMNS "$COLUMNS" -} - _powerline_prompt() { local last_exit_code=$? PS1="$($POWERLINE_COMMAND shell left -r bash_prompt --last_exit_code=$last_exit_code --jobnum="$(jobs -p|wc -l)")" @@ -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 diff --git a/powerline/bindings/fish/powerline-setup.fish b/powerline/bindings/fish/powerline-setup.fish index ee90c9fd..75ca19c4 100644 --- a/powerline/bindings/fish/powerline-setup.fish +++ b/powerline/bindings/fish/powerline-setup.fish @@ -20,18 +20,18 @@ function powerline-setup " end _powerline_update - function _powerline_tmux_setenv - if test -n "$TMUX" + if test -w "$TMUX" + function _powerline_tmux_setenv tmux setenv -g TMUX_$argv[1]_(tmux display -p "#D" | tr -d "%") "$argv[2]" tmux refresh -S end + function --on-variable PWD _powerline_tmux_set_pwd + _powerline_tmux_setenv PWD "$PWD" + end + function --on-signal WINCH _powerline_tmux_set_columns + _powerline_tmux_setenv COLUMNS "$COLUMNS" + end + _powerline_tmux_set_columns + _powerline_tmux_set_pwd end - function --on-variable PWD _powerline_tmux_set_pwd - _powerline_tmux_setenv PWD "$PWD" - end - function --on-signal WINCH _powerline_tmux_set_columns - _powerline_tmux_setenv COLUMNS "$COLUMNS" - end - _powerline_tmux_set_columns - _powerline_tmux_set_pwd end diff --git a/powerline/bindings/tcsh/powerline.tcsh b/powerline/bindings/tcsh/powerline.tcsh index 48566318..44f969b6 100644 --- a/powerline/bindings/tcsh/powerline.tcsh +++ b/powerline/bindings/tcsh/powerline.tcsh @@ -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" diff --git a/powerline/bindings/zsh/powerline.zsh b/powerline/bindings/zsh/powerline.zsh index 21f56740..347d236a 100644 --- a/powerline/bindings/zsh/powerline.zsh +++ b/powerline/bindings/zsh/powerline.zsh @@ -8,22 +8,37 @@ 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 - tmux setenv -g TMUX_"$1"_$(tmux display -p "#D" | tr -d %) "$2" - tmux refresh -S + # 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_tmux_set_columns() { - _powerline_tmux_setenv COLUMNS "$COLUMNS" -} - _powerline_precmd() { # If you are wondering why I am not using the same code as I use for bash # ($(jobs|wc -l)): consider the following test: @@ -47,7 +62,6 @@ _powerline_setup_prompt() { fi done precmd_functions+=( _powerline_precmd ) - chpwd_functions+=( _powerline_tmux_set_pwd ) _powerline_set_true_keymap_name "${${(Q)${${(z)${"$(bindkey -lL main)"}}[3]}}:-.safe}" if zmodload zsh/zpython &>/dev/null ; then zpython 'from powerline.bindings.zsh import setup as _powerline_setup' @@ -106,10 +120,7 @@ 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 From 1add2b63de4695a980d335d2c7770573cdca74e4 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 15 Feb 2014 20:47:20 +0400 Subject: [PATCH 3/3] Disable mode support on <=zsh-4.3.10 Fixes #800 --- powerline/bindings/zsh/powerline.zsh | 76 ++++++++++++++++++---------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/powerline/bindings/zsh/powerline.zsh b/powerline/bindings/zsh/powerline.zsh index 347d236a..8d23c39e 100644 --- a/powerline/bindings/zsh/powerline.zsh +++ b/powerline/bindings/zsh/powerline.zsh @@ -39,7 +39,53 @@ _powerline_init_tmux_support() { fi } -_powerline_precmd() { +_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_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 @@ -51,18 +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 ) - _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()' @@ -99,28 +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 - setopt promptpercent setopt promptsubst _powerline_setup_prompt _powerline_init_tmux_support +_powerline_init_modes_support