diff --git a/powerline/bindings/zsh/__init__.py b/powerline/bindings/zsh/__init__.py new file mode 100644 index 00000000..75b36658 --- /dev/null +++ b/powerline/bindings/zsh/__init__.py @@ -0,0 +1,43 @@ +import zsh +from powerline.core import Powerline + + +class Args(object): + @property + def last_exit_code(self): + return zsh.last_exit_code() + + @property + def last_pipe_status(self): + return zsh.pipestatus() + + +class Prompt(object): + __slots__ = ('render', 'side', 'savedpsvar', 'savedps') + + def __init__(self, powerline, side, savedpsvar=None, savedps=None): + self.render = powerline.renderer.render + self.side = side + self.savedpsvar = savedpsvar + self.savedps = savedps + + def __str__(self): + return self.render(width=zsh.columns(), side=self.side).encode('utf-8') + + def __del__(self): + if self.savedps: + zsh.setvalue(self.savedpsvar, self.savedps) + + +def set_prompt(powerline, psvar, side): + savedps = zsh.getvalue(psvar) + zpyvar = 'ZPYTHON_POWERLINE_' + psvar + prompt = Prompt(powerline, side, psvar, savedps) + zsh.set_special_string(zpyvar, prompt) + zsh.setvalue(psvar, '${' + zpyvar + '}') + + +def setup(): + powerline = Powerline(ext='shell', renderer_module='zsh_prompt', segment_info=Args()) + set_prompt(powerline, 'PS1', 'left') + set_prompt(powerline, 'RPS1', 'right') diff --git a/powerline/bindings/zsh/powerline.zsh b/powerline/bindings/zsh/powerline.zsh index 4512a6f1..4499bf9c 100644 --- a/powerline/bindings/zsh/powerline.zsh +++ b/powerline/bindings/zsh/powerline.zsh @@ -1,7 +1,3 @@ -_powerline_precmd() { - _powerline_tmux_set_pwd -} - _powerline_tmux_setenv() { if [[ -n "$TMUX" ]]; then tmux setenv TMUX_"$1"_$(tmux display -p "#D" | tr -d %) "$2" @@ -22,11 +18,17 @@ _powerline_install_precmd() { return fi done - precmd_functions+=(_powerline_precmd) + precmd_functions+=(_powerline_tmux_set_pwd) setopt promptpercent setopt promptsubst - PS1='$(powerline shell left -r zsh_prompt --last_exit_code=$? --last_pipe_status="$pipestatus")' - RPS1='$(powerline shell right -r zsh_prompt --last_exit_code=$? --last_pipe_status="$pipestatus")' + if zmodload zsh/zpython &>/dev/null ; then + zpython 'from powerline.bindings.zsh import setup as powerline_setup' + zpython 'powerline_setup()' + zpython 'del powerline_setup' + else + PS1='$(powerline shell left -r zsh_prompt --last_exit_code=$? --last_pipe_status="$pipestatus")' + RPS1='$(powerline shell right -r zsh_prompt --last_exit_code=$? --last_pipe_status="$pipestatus")' + fi } trap "_powerline_tmux_set_columns" SIGWINCH