Indeed, ps1.sh was written and tested with bash > 4.2.
bash < 4.2 does not offer "declare -g".
1 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,100 @@ |
1 |
+# Declare and fill variables providing ANSI colors enclosed between |
|
2 |
+# \[ and \], as per the "PROMPTING" section of man bash: |
|
3 |
+function declare_colors { |
|
4 |
+ local ci cj cn |
|
5 |
+ c_normal='\[\e[0m\]' |
|
6 |
+ for cn in {,bright_}{black,red,green,yellow,blue,magenta,cyan,white}; do |
|
7 |
+ eval "c_${cn}='\[\e[${ci:=0};${cj:=30}m\]'" |
|
8 |
+ ((++cj,(cj==38)?(cj=30,++ci):1)) |
|
9 |
+ done |
|
10 |
+} |
|
11 |
+ |
|
12 |
+function disable_colors { |
|
13 |
+ local cn |
|
14 |
+ for cn in normal {,bright_}{black,red,green,yellow,blue,magenta,cyan,white}; do |
|
15 |
+ eval "c_${cn}=''" |
|
16 |
+ done |
|
17 |
+} |
|
18 |
+ |
|
19 |
+# Generate the PS1 variable; doing that in a function allows to reflect almost |
|
20 |
+# anything in the prompt. |
|
21 |
+function generate_ps1 { |
|
22 |
+ # Save the return code value (rcv) |
|
23 |
+ local rcv=$? |
|
24 |
+ |
|
25 |
+ # Color for brackets and braces |
|
26 |
+ local bc="${c_red}" |
|
27 |
+ |
|
28 |
+ # Pick the return code color (rcc) |
|
29 |
+ local rcc='c_bright_green' |
|
30 |
+ [ $rcv -ne 0 ] && rcc='c_bright_red' |
|
31 |
+ |
|
32 |
+ local rc dstamp tstamp user host cwdir es |
|
33 |
+ rc=$( printf "%s[%s${rcv}%s]" "${bc}" "${!rcc}" "${bc}") |
|
34 |
+ tstamp=$( printf '[%s\\t%s]' "${c_bright_yellow}" "${bc}") |
|
35 |
+ user=$( printf '[%s\\u%s]' "${c_cyan}" "${bc}") |
|
36 |
+ host=$( printf '{%s\\h%s}' "${c_cyan}" "${bc}") |
|
37 |
+ cwdir=$( printf '%s\w%s ' "${c_green}" "${c_normal}") |
|
38 |
+ es=$( printf '%s\$%s ' "${c_red}" "${c_normal}") |
|
39 |
+ |
|
40 |
+ if [ "${PS1_DISPLAY_DATE}" ]; then |
|
41 |
+ dstamp=$(printf '[%s\\D{%%F}%s]' "${c_bright_yellow}" "${bc}") |
|
42 |
+ fi |
|
43 |
+ |
|
44 |
+ PS1="${rc}${dstamp}${tstamp}${user}${host}${cwdir}${es}" |
|
45 |
+ |
|
46 |
+ # Also set PS2 and PS4: |
|
47 |
+ PS2="${c['bright_green']}" |
|
48 |
+ PS4="+ ${c['cyan']}[trace]${c['normal']} " |
|
49 |
+ |
|
50 |
+ # It makes sense to export PS4 (so that e.g. "bash foobar.sh" benefit from |
|
51 |
+ # it): |
|
52 |
+ export PS4 |
|
53 |
+} |
|
54 |
+ |
|
55 |
+# Provide a helper function to swiftly enable or disable the date in the |
|
56 |
+# prompt: |
|
57 |
+function ps1_toggle_date { |
|
58 |
+ if [ "${PS1_DISPLAY_DATE}" ]; then |
|
59 |
+ unset PS1_DISPLAY_DATE |
|
60 |
+ else |
|
61 |
+ PS1_DISPLAY_DATE='yes' |
|
62 |
+ fi |
|
63 |
+} |
|
64 |
+ |
|
65 |
+# Provide a helper function to swiftly enable or disable colors in the |
|
66 |
+# prompt: |
|
67 |
+function ps1_toggle_colors { |
|
68 |
+ if [ "${PS1_USE_COLORS}" ]; then |
|
69 |
+ unset PS1_USE_COLORS |
|
70 |
+ disable_colors |
|
71 |
+ else |
|
72 |
+ declare_colors |
|
73 |
+ PS1_USE_COLORS='yes' |
|
74 |
+ fi |
|
75 |
+} |
|
76 |
+ |
|
77 |
+# Provide a helper function to swiftly reduce the prompt to '$ ' -- this is |
|
78 |
+# useful e.g. for documentation purposes, when one wants to run a few commands |
|
79 |
+# and copy the whole terminal output without the prompt (which usually reflects |
|
80 |
+# undesired details such as user and hostname): |
|
81 |
+function ps1_toggle_prompt { |
|
82 |
+ local min_prompt='\$ ' |
|
83 |
+ if [ "${PS1}" == "${min_prompt}" ]; then |
|
84 |
+ PROMPT_COMMAND='generate_ps1' |
|
85 |
+ generate_ps1 |
|
86 |
+ else |
|
87 |
+ unset PROMPT_COMMAND |
|
88 |
+ PS1="${min_prompt}" |
|
89 |
+ fi |
|
90 |
+} |
|
91 |
+ |
|
92 |
+# By default, use colors but do not display the date: |
|
93 |
+ps1_toggle_colors |
|
94 |
+#ps1_toggle_date |
|
95 |
+ |
|
96 |
+# Instruct bash to regenerate PS1 before printing the prompt: |
|
97 |
+PROMPT_COMMAND='generate_ps1' |
|
98 |
+ |
|
99 |
+# Generate PS1 at least once: |
|
100 |
+generate_ps1 |