summaryrefslogtreecommitdiffstats
path: root/powerline/bindings/bash/powerline.sh
blob: 2c0943c3c562a1325d24c6b67b271ff9b24e4d18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
_powerline_columns_fallback() {
	if command -v stty &>/dev/null ; then
		local cols="$(stty size 2>/dev/null)"
		if ! test -z "$cols" ; then
			echo "${cols#* }"
			return 0
		fi
	fi
	echo 0
	return 0
}

_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_return() {
	return $1
}

_POWERLINE_HAS_PIPESTATUS="$(
	_powerline_return 0 | _powerline_return 43
	test "${PIPESTATUS[*]}" = "0 43"
	echo "$?"
)"

_powerline_has_pipestatus() {
	return $_POWERLINE_HAS_PIPESTATUS
}

_powerline_status_wrapper() {
	local last_exit_code=$? last_pipe_status=( "${PIPESTATUS[@]}" )

	if ! _powerline_has_pipestatus \
	   || test "${#last_pipe_status[@]}" -eq "0" \
	   || test "$last_exit_code" != "${last_pipe_status[$(( ${#last_pipe_status[@]} - 1 ))]}" ; then
		last_pipe_status=()
	fi
	"$@" $last_exit_code "${last_pipe_status[*]}"
	return $last_exit_code
}

_powerline_add_status_wrapped_command() {
	local action="$1" ; shift
	local cmd="$1" ; shift
	full_cmd="_powerline_status_wrapper $cmd"
	if test "$action" = "append" ; then
		PROMPT_COMMAND="$PROMPT_COMMAND"$'\n'"$full_cmd"
	else
		PROMPT_COMMAND="$full_cmd"$'\n'"$PROMPT_COMMAND"
	fi
}

_powerline_tmux_set_columns() {
	_powerline_tmux_setenv COLUMNS "${COLUMNS:-`_powerline_columns_fallback`}"
}

_powerline_init_tmux_support() {
	if test -n "$TMUX" && tmux refresh -S &>/dev/null ; then
		# TMUX variable may be unset to create new tmux session inside this one
		_POWERLINE_TMUX="$TMUX"

		trap '_powerline_tmux_set_columns' WINCH
		_powerline_tmux_set_columns

		test "$PROMPT_COMMAND" != "${PROMPT_COMMAND/_powerline_tmux_set_pwd}" \
			|| _powerline_add_status_wrapped_command append _powerline_tmux_set_pwd
	fi
}

_powerline_local_prompt() {
	# Arguments:
	# 1: side
	# 2: renderer_module arg
	# 3: last_exit_code
	# 4: last_pipe_status
	# 5: jobnum
	# 6: local theme
	"$POWERLINE_COMMAND" $POWERLINE_COMMAND_ARGS shell $1 \
		$2 \
		--last-exit-code=$3 \
		--last-pipe-status="$4" \
		--jobnum=$5 \
		--renderer-arg="client_id=$$" \
		--renderer-arg="local_theme=$6"
}

_powerline_prompt() {
	# Arguments:
	# 1: side
	# 2: last_exit_code
	# 3: last_pipe_status
	# 4: jobnum
	"$POWERLINE_COMMAND" $POWERLINE_COMMAND_ARGS shell $1 \
		--width="${COLUMNS:-$(_powerline_columns_fallback)}" \
		-r.bash \
		--last-exit-code=$2 \
		--last-pipe-status="$3" \
		--jobnum=$4 \
		--renderer-arg="client_id=$$"
}

_powerline_set_prompt() {
	local last_exit_code=$1 ; shift
	local last_pipe_status=$1 ; shift
	local jobnum="$(jobs -p|wc -l)"
	PS1="$(_powerline_prompt aboveleft $last_exit_code "$last_pipe_status" $jobnum)"
	if test -n "$POWERLINE_SHELL_CONTINUATION$POWERLINE_BASH_CONTINUATION" ; then
		PS2="$(_powerline_local_prompt left -r.bash $last_exit_code "$last_pipe_status" $jobnum continuation)"
	fi
	if test -n "$POWERLINE_SHELL_SELECT$POWERLINE_BASH_SELECT" ; then
		PS3="$(_powerline_local_prompt left '' $last_exit_code "$last_pipe_status" $jobnum select)"
	fi
}

_powerline_setup_prompt() {
	VIRTUAL_ENV_DISABLE_PROMPT=1
	if test -z "${POWERLINE_COMMAND}" ; then
		POWERLINE_COMMAND="$("$POWERLINE_CONFIG_COMMAND" shell command)"
	fi
	test "$PROMPT_COMMAND" != "${PROMPT_COMMAND%_powerline_set_prompt*}" \
		|| _powerline_add_status_wrapped_command prepend _powerline_set_prompt
	PS2="$(_powerline_local_prompt left -r.bash 0 0 0 continuation)"
	PS3="$(_powerline_local_prompt left '' 0 0 0 select)"
}

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 "$BASH_SOURCE")/../../../scripts/powerline-config"
	fi
fi

if "${POWERLINE_CONFIG_COMMAND}" shell --shell=bash uses prompt ; then
	_powerline_setup_prompt
fi
if "${POWERLINE_CONFIG_COMMAND}" shell --shell=bash uses tmux ; then
	_powerline_init_tmux_support
fi