summaryrefslogtreecommitdiffstats
path: root/powerline/bindings/shell/powerline.sh
diff options
context:
space:
mode:
Diffstat (limited to 'powerline/bindings/shell/powerline.sh')
-rw-r--r--powerline/bindings/shell/powerline.sh239
1 files changed, 239 insertions, 0 deletions
diff --git a/powerline/bindings/shell/powerline.sh b/powerline/bindings/shell/powerline.sh
new file mode 100644
index 0000000..e1b067d
--- /dev/null
+++ b/powerline/bindings/shell/powerline.sh
@@ -0,0 +1,239 @@
+_POWERLINE_SOURCED="$_"
+_powerline_columns_fallback() {
+ if command -v stty >/dev/null ; then
+ # Ksh does not have “local” built-in
+ _powerline_cols="$(stty size 2>/dev/null)"
+ if ! test -z "$_powerline_cols" ; then
+ echo "${_powerline_cols#* }"
+ return 0
+ fi
+ fi
+ echo 0
+ return 0
+}
+
+_powerline_has_jobs_in_subshell() {
+ if test -n "$_POWERLINE_HAS_JOBS_IN_SUBSHELL" ; then
+ return $_POWERLINE_HAS_JOBS_IN_SUBSHELL
+ elif test -z "$1" ; then
+ sleep 1 &
+ # Check whether shell outputs anything in a subshell when using jobs
+ # built-in. Shells like dash will not output anything meaning that
+ # I have to bother with temporary files.
+ test "$(jobs -p|wc -l)" -gt 0
+ else
+ case "$1" in
+ dash|bb|ash) return 1 ;;
+ mksh|ksh|bash) return 0 ;;
+ *) _powerline_has_jobs_in_subshell ;;
+ esac
+ fi
+ _POWERLINE_HAS_JOBS_IN_SUBSHELL=$?
+ return $_POWERLINE_HAS_JOBS_IN_SUBSHELL
+}
+
+_powerline_set_append_trap() {
+ if _powerline_has_jobs_in_subshell "$@" ; then
+ _powerline_append_trap() {
+ # Arguments: command, signal
+ # Ksh does not have “local” built-in
+ _powerline_traps="$(trap)"
+ if echo "$_powerline_traps" | grep -cm1 $2'$' >/dev/null ; then
+ _powerline_traps="$(echo "$_powerline_traps" | sed "s/ $2/'\\n$1' $2/")"
+ eval "$_powerline_traps"
+ else
+ trap "$1" $2
+ fi
+ }
+ else
+ _powerline_append_trap() {
+ # Arguments: command, signal
+ _powerline_create_temp
+ trap > $_POWERLINE_TEMP
+ if grep -cm1 $2'$' $_POWERLINE_TEMP >/dev/null ; then
+ sed -i -e "s/ $2/'\\n$1' $2/"
+ . $_POWERLINE_TEMP
+ else
+ trap "$1" $2
+ fi
+ echo -n > $_POWERLINE_TEMP
+ }
+ fi
+ _powerline_set_append_trap() {
+ return 0
+ }
+}
+
+_powerline_create_temp() {
+ if test -z "$_POWERLINE_TEMP" || ! test -e "$_POWERLINE_TEMP" ; then
+ _POWERLINE_TEMP="$(mktemp "${TMPDIR:-/tmp}/powerline.XXXXXXXX")"
+ _powerline_append_trap 'rm $_POWERLINE_TEMP' EXIT
+ fi
+}
+
+_powerline_set_set_jobs() {
+ if _powerline_has_jobs_in_subshell "$@" ; then
+ _powerline_set_jobs() {
+ _POWERLINE_JOBS="$(jobs -p|wc -l|tr -d ' ')"
+ }
+ else
+ _powerline_set_append_trap "$@"
+ _POWERLINE_PID=$$
+ _powerline_append_trap '_powerline_do_set_jobs' USR1
+ _powerline_do_set_jobs() {
+ _powerline_create_temp
+ jobs -p > $_POWERLINE_TEMP
+ }
+ # This command will always be launched from a subshell, thus a hack is
+ # needed to run `jobs -p` outside of the subshell.
+ _powerline_set_jobs() {
+ kill -USR1 $_POWERLINE_PID
+ # Note: most likely this will read data from the previous run. Tests
+ # show that it is OK for some reasons.
+ _POWERLINE_JOBS="$(wc -l < $_POWERLINE_TEMP | tr -d ' ')"
+ }
+ fi
+ _powerline_set_set_jobs() {
+ return 0
+ }
+}
+
+_powerline_set_command() {
+ if test -z "${POWERLINE_COMMAND}" ; then
+ POWERLINE_COMMAND="$("$POWERLINE_CONFIG_COMMAND" shell command)"
+ fi
+}
+
+_powerline_tmux_pane() {
+ echo "${TMUX_PANE:-`TMUX="$_POWERLINE_TMUX" tmux display -p "#D"`}" | \
+ tr -d ' %'
+}
+
+_powerline_tmux_setenv() {
+ TMUX="$_POWERLINE_TMUX" tmux setenv -g TMUX_"$1"_`_powerline_tmux_pane` "$2"
+ TMUX="$_POWERLINE_TMUX" tmux refresh -S
+}
+
+_powerline_tmux_set_pwd() {
+ if test "$_POWERLINE_SAVED_PWD" != "$PWD" ; then
+ _POWERLINE_SAVED_PWD="$PWD"
+ _powerline_tmux_setenv PWD "$PWD"
+ fi
+}
+
+_powerline_tmux_set_columns() {
+ _powerline_tmux_setenv COLUMNS "${COLUMNS:-$(_powerline_columns_fallback)}"
+}
+
+_powerline_set_renderer_arg() {
+ case "$1" in
+ bb|ash) _POWERLINE_RENDERER_ARG="-r .bash" ;;
+ mksh|ksh) _POWERLINE_RENDERER_ARG="-r .ksh" ;;
+ bash|dash) _POWERLINE_RENDERER_ARG= ;;
+ esac
+}
+
+_powerline_set_jobs() {
+ _powerline_set_set_jobs
+ _powerline_set_jobs
+}
+
+_powerline_local_prompt() {
+ # Arguments: side, exit_code, local theme
+ _powerline_set_jobs
+ "$POWERLINE_COMMAND" $POWERLINE_COMMAND_ARGS shell $1 \
+ $_POWERLINE_RENDERER_ARG \
+ --renderer-arg="client_id=$$" \
+ --last-exit-code=$2 \
+ --jobnum=$_POWERLINE_JOBS \
+ --renderer-arg="local_theme=$3"
+}
+
+_powerline_prompt() {
+ # Arguments: side, exit_code
+ _powerline_set_jobs
+ "$POWERLINE_COMMAND" $POWERLINE_COMMAND_ARGS shell $1 \
+ --width="${COLUMNS:-$(_powerline_columns_fallback)}" \
+ $_POWERLINE_RENDERER_ARG \
+ --renderer-arg="client_id=$$" \
+ --last-exit-code=$2 \
+ --jobnum=$_POWERLINE_JOBS
+ _powerline_update_psN
+}
+
+_powerline_setup_psN() {
+ case "$1" in
+ mksh|ksh|bash)
+ _POWERLINE_PID=$$
+ _powerline_update_psN() {
+ kill -USR1 $_POWERLINE_PID
+ }
+ # No command substitution in PS2 and PS3
+ _powerline_set_psN() {
+ if test -n "$POWERLINE_SHELL_CONTINUATION" ; then
+ PS2="$(_powerline_local_prompt left $? continuation)"
+ fi
+ if test -n "$POWERLINE_SHELL_SELECT" ; then
+ PS3="$(_powerline_local_prompt left $? select)"
+ fi
+ }
+ _powerline_append_trap '_powerline_set_psN' USR1
+ _powerline_set_psN
+ ;;
+ bb|ash|dash)
+ _powerline_update_psN() {
+ # Do nothing
+ return
+ }
+ PS2='$(_powerline_local_prompt left $? continuation)'
+ # No select support
+ ;;
+ esac
+}
+
+_powerline_setup_prompt() {
+ VIRTUAL_ENV_DISABLE_PROMPT=1
+ _powerline_set_append_trap "$@"
+ _powerline_set_set_jobs "$@"
+ _powerline_set_command "$@"
+ _powerline_set_renderer_arg "$@"
+ PS1='$(_powerline_prompt aboveleft $?)'
+ PS2="$(_powerline_local_prompt left 0 continuation)"
+ PS3="$(_powerline_local_prompt left 0 select)"
+ _powerline_setup_psN "$@"
+}
+
+_powerline_init_tmux_support() {
+ # Dash does not have &>/dev/null
+ if test -n "$TMUX" && tmux refresh -S >/dev/null 2>/dev/null ; then
+ # TMUX variable may be unset to create new tmux session inside this one
+ _POWERLINE_TMUX="$TMUX"
+
+ _powerline_set_append_trap "$@"
+
+ # If _powerline_tmux_set_pwd is used before _powerline_prompt it sets $?
+ # to zero in ksh.
+ PS1="$PS1"'$(_powerline_tmux_set_pwd)'
+ _powerline_append_trap '_powerline_tmux_set_columns' WINCH
+ _powerline_tmux_set_columns
+ fi
+}
+
+if test -z "${POWERLINE_CONFIG_COMMAND}" ; then
+ if command -v powerline-config >/dev/null ; then
+ POWERLINE_CONFIG_COMMAND=powerline-config
+ else
+ POWERLINE_CONFIG_COMMAND="$(dirname "$_POWERLINE_SOURCED")/../../../scripts/powerline-config"
+ fi
+fi
+
+# Strips the leading `-`: it may be present when shell is a login shell
+_POWERLINE_USED_SHELL=${0#-}
+_POWERLINE_USED_SHELL=${_POWERLINE_USED_SHELL##*/}
+
+if "${POWERLINE_CONFIG_COMMAND}" shell uses tmux ; then
+ _powerline_init_tmux_support $_POWERLINE_USED_SHELL
+fi
+if "${POWERLINE_CONFIG_COMMAND}" shell --shell=bash uses prompt ; then
+ _powerline_setup_prompt $_POWERLINE_USED_SHELL
+fi