最后活跃于 1739614570

Customization of synth-shell for personal use

dartokloning's Avatar dartokloning 修订了这个 Gist 1739614570. 跳至此修订

1 file changed, 3 insertions, 3 deletions

shell-prompt.sh

@@ -262,8 +262,8 @@ enable_command_on_new_line=true # Add new line between prompt and command
262 262 ##==============================================================================
263 263 ## USER
264 264 ##==============================================================================
265 - font_color_user="white"
266 - background_user="blue"
265 + font_color_user="black"
266 + background_user="green"
267 267 texteffect_user="bold"
268 268 ##==============================================================================
269 269 ## HOST
@@ -316,7 +316,7 @@ texteffect_tf="bold"
316 316 ## CLOCK
317 317 ##==============================================================================
318 318 font_color_clock="white"
319 - background_clock="light-blue"
319 + background_clock="black"
320 320 texteffect_clock="bold"
321 321 clock_format="%H:%M:%S"
322 322 ##==============================================================================

dartokloning's Avatar dartokloning 修订了这个 Gist 1737995157. 跳至此修订

1 file changed, 722 insertions

shell-prompt.sh(file created)

@@ -0,0 +1,722 @@
1 + #!/usr/bin/env bash
2 +
3 + ##
4 + ##
5 + ## Visit for instructions and more information:
6 + ## https://github.com/andresgongora/synth-shell/
7 + ##
8 + ##
9 +
10 + ##
11 + ##==================================================================================================
12 + ## CODE PARSERS
13 + ##==================================================================================================
14 + ##------------------------------------------------------------------------------
15 + ##
16 + get8bitCode()
17 + {
18 + CODE=$1
19 + case $CODE in
20 + default)
21 + echo 9
22 + ;;
23 + none)
24 + echo 9
25 + ;;
26 + black)
27 + echo 0
28 + ;;
29 + red)
30 + echo 1
31 + ;;
32 + green)
33 + echo 2
34 + ;;
35 + yellow)
36 + echo 3
37 + ;;
38 + blue)
39 + echo 4
40 + ;;
41 + magenta|purple|pink)
42 + echo 5
43 + ;;
44 + cyan)
45 + echo 6
46 + ;;
47 + light-gray)
48 + echo 7
49 + ;;
50 + dark-gray)
51 + echo 60
52 + ;;
53 + light-red)
54 + echo 61
55 + ;;
56 + light-green)
57 + echo 62
58 + ;;
59 + light-yellow)
60 + echo 63
61 + ;;
62 + light-blue)
63 + echo 64
64 + ;;
65 + light-magenta|light-purple)
66 + echo 65
67 + ;;
68 + light-cyan)
69 + echo 66
70 + ;;
71 + white)
72 + echo 67
73 + ;;
74 + *)
75 + echo 0
76 + esac
77 + }
78 + ##------------------------------------------------------------------------------
79 + ##
80 + getColorCode()
81 + {
82 + COLOR=$1
83 + ## Check if color is a 256-color code
84 + if [ $COLOR -eq $COLOR ] 2> /dev/null; then
85 + if [ $COLOR -gt 0 -a $COLOR -lt 256 ]; then
86 + echo "38;5;$COLOR"
87 + else
88 + echo 0
89 + fi
90 + ## Or if color key-workd
91 + else
92 + BITCODE=$(get8bitCode $COLOR)
93 + COLORCODE=$(($BITCODE + 30))
94 + echo $COLORCODE
95 + fi
96 + }
97 + ##------------------------------------------------------------------------------
98 + ##
99 + getBackgroundCode()
100 + {
101 + COLOR=$1
102 + ## Check if color is a 256-color code
103 + if [ $COLOR -eq $COLOR ] 2> /dev/null; then
104 + if [ $COLOR -gt 0 -a $COLOR -lt 256 ]; then
105 + echo "48;5;$COLOR"
106 + else
107 + echo 0
108 + fi
109 + ## Or if color key-workd
110 + else
111 + BITCODE=$(get8bitCode $COLOR)
112 + COLORCODE=$(($BITCODE + 40))
113 + echo $COLORCODE
114 + fi
115 + }
116 + ##------------------------------------------------------------------------------
117 + ##
118 + getEffectCode()
119 + {
120 + EFFECT=$1
121 + NONE=0
122 + case $EFFECT in
123 + none)
124 + echo $NONE
125 + ;;
126 + default)
127 + echo $NONE
128 + ;;
129 + bold)
130 + echo 1
131 + ;;
132 + bright)
133 + echo 1
134 + ;;
135 + dim)
136 + echo 2
137 + ;;
138 + underline)
139 + echo 4
140 + ;;
141 + blink)
142 + echo 5
143 + ;;
144 + reverse)
145 + echo 7
146 + ;;
147 + hidden)
148 + echo 8
149 + ;;
150 + strikeout)
151 + echo 9
152 + ;;
153 + *)
154 + echo $NONE
155 + esac
156 + }
157 + ##------------------------------------------------------------------------------
158 + ##
159 + getFormattingSequence()
160 + {
161 + START='\e[0;'
162 + MIDLE=$1
163 + END='m'
164 + echo -n "$START$MIDLE$END"
165 + }
166 + ##==================================================================================================
167 + ## AUX
168 + ##==================================================================================================
169 + applyCodeToText()
170 + {
171 + local RESET=$(getFormattingSequence $(getEffectCode none))
172 + TEXT=$1
173 + CODE=$2
174 + echo -n "$CODE$TEXT$RESET"
175 + }
176 + ##==================================================================================================
177 + ## MAIN FUNCTIONS
178 + ##==================================================================================================
179 + ##------------------------------------------------------------------------------
180 + ##
181 + getFormatCode()
182 + {
183 + local RESET=$(getFormattingSequence $(getEffectCode none))
184 + ## NO ARGUMENT PROVIDED
185 + if [ "$#" -eq 0 ]; then
186 + echo -n "$RESET"
187 + ## 1 ARGUMENT -> ASSUME TEXT COLOR
188 + elif [ "$#" -eq 1 ]; then
189 + TEXT_COLOR=$(getFormattingSequence $(getColorCode $1))
190 + echo -n "$TEXT_COLOR"
191 + ## ARGUMENTS PROVIDED
192 + else
193 + FORMAT=""
194 + while [ "$1" != "" ]; do
195 + ## PROCESS ARGUMENTS
196 + TYPE=$1
197 + ARGUMENT=$2
198 + case $TYPE in
199 + -c)
200 + CODE=$(getColorCode $ARGUMENT)
201 + ;;
202 + -b)
203 + CODE=$(getBackgroundCode $ARGUMENT)
204 + ;;
205 + -e)
206 + CODE=$(getEffectCode $ARGUMENT)
207 + ;;
208 + *)
209 + CODE=""
210 + esac
211 + ## ADD CODE SEPARATOR IF NEEDED
212 + if [ "$FORMAT" != "" ]; then
213 + FORMAT="$FORMAT;"
214 + fi
215 + ## APPEND CODE
216 + FORMAT="$FORMAT$CODE"
217 + # Remove arguments from stack
218 + shift
219 + shift
220 + done
221 + ## APPLY FORMAT TO TEXT
222 + FORMAT_CODE=$(getFormattingSequence $FORMAT)
223 + echo -n "${FORMAT_CODE}"
224 + fi
225 + }
226 + ##------------------------------------------------------------------------------
227 + ##
228 + formatText()
229 + {
230 + local RESET=$(getFormattingSequence $(getEffectCode none))
231 + ## NO ARGUMENT PROVIDED
232 + if [ "$#" -eq 0 ]; then
233 + echo -n "${RESET}"
234 + ## ONLY A STRING PROVIDED -> Append reset sequence
235 + elif [ "$#" -eq 1 ]; then
236 + TEXT=$1
237 + echo -n "${TEXT}${RESET}"
238 + ## ARGUMENTS PROVIDED
239 + else
240 + TEXT=$1
241 + FORMAT_CODE=$(getFormatCode "${@:2}")
242 + applyCodeToText "$TEXT" "$FORMAT_CODE"
243 + fi
244 + }
245 + ##------------------------------------------------------------------------------
246 + ##
247 + removeColorCodes()
248 + {
249 + printf "$1" | sed 's/\x1b\[[0-9;]*m//g'
250 + }
251 +
252 + ##==============================================================================
253 + ## MAIN FORMAT
254 + ##==============================================================================
255 + format="USER HOST PWD GIT PYENV TF KUBE DATE CLOCK"
256 + separator_char='\uE0B0' # Separation character, '\uE0B0'=triangle
257 + separator_padding_left='' # Add char or string to the left of the separator
258 + separator_padding_right='' # Add char or string to the right of the separator
259 + segment_padding=' ' # Add char or string around segment text
260 + enable_vertical_padding=true # Add extra new line over prompt
261 + enable_command_on_new_line=true # Add new line between prompt and command
262 + ##==============================================================================
263 + ## USER
264 + ##==============================================================================
265 + font_color_user="white"
266 + background_user="blue"
267 + texteffect_user="bold"
268 + ##==============================================================================
269 + ## HOST
270 + ##==============================================================================
271 + font_color_host="white"
272 + background_host="light-blue"
273 + texteffect_host="bold"
274 + ##==============================================================================
275 + ## PWD (working dir)
276 + ##==============================================================================
277 + font_color_pwd="dark-gray"
278 + background_pwd="white"
279 + texteffect_pwd="bold"
280 + max_pwd_char="25"
281 + ##==============================================================================
282 + ## GIT
283 + ##==============================================================================
284 + font_color_git="light-gray"
285 + background_git="dark-gray"
286 + texteffect_git="bold"
287 + git_symbol_synced=''
288 + git_symbol_unpushed=' ▲'
289 + git_symbol_unpulled=' ▼'
290 + git_symbol_unpushedunpulled=' ◆'
291 + git_symbol_dirty=' ◔'
292 + git_symbol_dirty_unpushed=' ◔ △'
293 + git_symbol_dirty_unpulled=' ◔ ▽'
294 + git_symbol_dirty_unpushedunpulled=' ◔ ◇'
295 + git_symbol_stash='🗎'
296 + git_update_period_minutes=15 # Use -1 to disable automatic updates
297 + ##==============================================================================
298 + ## PYENV
299 + ##==============================================================================
300 + font_color_pyenv="white"
301 + background_pyenv="blue"
302 + texteffect_pyenv="bold"
303 + ##==============================================================================
304 + ## KUBERNETES
305 + ##==============================================================================
306 + font_color_kube="white"
307 + background_kube="purple"
308 + texteffect_kube="bold"
309 + ##==============================================================================
310 + ## TERRAFORM WORKSPACE
311 + ##==============================================================================
312 + font_color_tf="purple"
313 + background_tf="light-purple"
314 + texteffect_tf="bold"
315 + ##==============================================================================
316 + ## CLOCK
317 + ##==============================================================================
318 + font_color_clock="white"
319 + background_clock="light-blue"
320 + texteffect_clock="bold"
321 + clock_format="%H:%M:%S"
322 + ##==============================================================================
323 + ## DATE
324 + ##==============================================================================
325 + font_color_date="white"
326 + background_date="light-purple"
327 + texteffect_date="bold"
328 + date_format="${hari}, %d ${bulan} %Y"
329 + ##==============================================================================
330 + ## INPUT (user typed command)
331 + ##==============================================================================
332 + font_color_input="45"
333 + background_input="none"
334 + texteffect_input="bold"
335 +
336 + ##==============================================================================
337 + ## EXTERNAL DEPENDENCIES
338 + ##==============================================================================
339 + [ "$(type -t include)" != 'function' ]&&{ include(){ { [ -z "$_IR" ]&&_IR="$PWD"&&cd "$(dirname "${BASH_SOURCE[0]}")"&&include "$1"&&cd "$_IR"&&unset _IR;}||{ local d="$PWD"&&cd "$(dirname "$PWD/$1")"&&. "$(basename "$1")"&&cd "$d";}||{ echo "Include failed $PWD->$1"&&exit 1;};};}
340 + synth_shell_prompt()
341 + {
342 + ##==============================================================================
343 + ## FUNCTIONS
344 + ##==============================================================================
345 + ##------------------------------------------------------------------------------
346 + ##
347 + ## Returns current git branch for current directory, if (and only if)
348 + ## the current directory is part of a git repository, and git is installed.
349 + ##
350 + ## In addition, it adds a symbol to indicate the state of the repository.
351 + ## By default, these symbols and their meaning are (set globally):
352 + ##
353 + ## UPSTREAM NO CHANGE DIRTY
354 + ## up to date SSP_GIT_SYNCED SSP_GIT_DIRTY
355 + ## ahead SSP_GIT_AHEAD SSP_GIT_DIRTY_AHEAD
356 + ## behind SSP_GIT_BEHIND SSP_GIT_DIRTY_BEHIND
357 + ## diverged SSP_GIT_DIVERGED SSP_GIT_DIRTY_DIVERGED
358 + ##
359 + ## Returns an empty string otherwise.
360 + ##
361 + ## Inspired by twolfson's sexy-bash-prompt:
362 + ## https://github.com/twolfson/sexy-bash-prompt
363 + ##
364 + getGitBranch()
365 + {
366 + ## Check if git is installed, otherwise skip this function so as to not
367 + ## generate any errors.
368 + if ! ( which git > /dev/null 2>&1 ); then
369 + echo ""
370 + return
371 + fi
372 + ## Check if in a git respository, otherwise skip since there is no info
373 + ## to print.
374 + local branch=$(git branch 2> /dev/null |\
375 + sed -n '/^[^*]/d;s/*\s*\(.*\)/\1/p')
376 + if [[ -z "$branch" ]]; then
377 + echo ""
378 + return
379 + fi
380 + ## Fetch branch, required to later determine if the local dir is up to date.
381 + ## Because doing so for every terminal prompt can be slow, the script will
382 + ## do so only if its globaly enabled (see config) and only periodically in
383 + ## the background.
384 + if [ "$SSP_GIT_UPDATE_PERIOD_MINUTES" -ge 0 ]; then
385 + ## Find .git, i.e., the root of the repository.
386 + local d="$PWD"
387 + local max_lvls=25
388 + while [ ! -e "./.git" -a $max_lvls -gt 0 ]; do
389 + cd .. # Go up 1 level
390 + max_lvls=$((max_lvls - 1))
391 + done
392 + local dot_git="${PWD}/.git"
393 + cd "$d"
394 + ## Check if submodule.
395 + if [ -f "$dot_git" ]; then
396 + local dot_git=$(cat $dot_git | grep 'gitdir' | sed 's/gitdir:\ //g')
397 + fi
398 + ## Get timestamp.
399 + if [ -d "$dot_git" -a -e "${dot_git}/FETCH_HEAD" ]; then
400 + local git_last_update=$(stat -c "%Y" "${dot_git}/FETCH_HEAD")
401 + fi
402 + ## Update if it's time to do so.
403 + if [ ! -z $git_last_update ]; then
404 + local current_timestamp=$(date +%s)
405 + local elapsed_minutes=$(((current_timestamp-git_last_update)/60))
406 + if [ "$elapsed_minutes" -ge "$SSP_GIT_UPDATE_PERIOD_MINUTES" ]; then
407 + git fetch --recurse-submodules > /dev/null 2>&1 &
408 + fi
409 + fi
410 + fi
411 + ## Get repository status.
412 + ## This information contains whether the current branch is ahead, behind or
413 + ## diverged (ahead & behind), as well as whether any file has been modified
414 + ## locally (is dirty).
415 + ## @note The repository must be fetched for this information to be accurate.
416 + ## @note The following git flags are used:
417 + ## --porcelain: script friendly output.
418 + ## -b: show branch tracking info.
419 + ## -u no: do not list untracked/dirty files.
420 + local is_dirty=false &&\
421 + [[ -n "$(git status --porcelain)" ]] &&\
422 + is_dirty=true
423 + local is_ahead=false &&\
424 + [[ "$(git status --porcelain -u no -b)" == *"ahead"* ]] &&\
425 + is_ahead=true
426 + local is_behind=false &&\
427 + [[ "$(git status --porcelain -u no -b)" == *"behind"* ]] &&\
428 + is_behind=true
429 + ## Determine symbol to show in prompt according to git status.
430 + if $is_dirty && $is_ahead && $is_behind; then
431 + local symbol=$SSP_GIT_DIRTY_DIVERGED
432 + elif $is_dirty && $is_ahead; then
433 + local symbol=$SSP_GIT_DIRTY_AHEAD
434 + elif $is_dirty && $is_behind; then
435 + local symbol=$SSP_GIT_DIRTY_BEHIND
436 + elif $is_dirty; then
437 + local symbol=$SSP_GIT_DIRTY
438 + elif $is_ahead && $is_behind; then
439 + local symbol=$SSP_GIT_DIVERGED
440 + elif $is_ahead; then
441 + local symbol=$SSP_GIT_AHEAD
442 + elif $is_behind; then
443 + local symbol=$SSP_GIT_BEHIND
444 + else
445 + local symbol=$SSP_GIT_SYNCED
446 + fi
447 + ## Get commit tag (if any).
448 + [[ -n "$(git tag --points-at HEAD)" ]] &&\
449 + local tag=" $(git tag --points-at HEAD)" || local tag=""
450 + ## Get stash count (if any).
451 + local git_stash=""
452 + local stashed_elements=$(git stash list 2> /dev/null | wc -l)
453 + if [ "$stashed_elements" -gt 0 ]; then
454 + git_stash=" ${stashed_elements}${SSP_GIT_STASH}"
455 + fi
456 + ## Return assembled prompt segmet with git info.
457 + echo "${branch}$symbol${git_stash}${tag}"
458 + }
459 + ##------------------------------------------------------------------------------
460 + ##
461 + ##
462 + getTerraform()
463 + {
464 + ## Check if terraform is installed, otherwise skip this function.
465 + if ! ( which terraform > /dev/null 2>&1 ); then
466 + echo ""
467 + return
468 + fi
469 + ## Check if we are in a terraform directory, otherwise skip.
470 + if [ ! -d .terraform ]; then
471 + echo ""
472 + return
473 + fi
474 + ## Get the terraform workspace
475 + local tf="$(terraform workspace show 2> /dev/null | tr -d '\n')"
476 + echo "$tf"
477 + }
478 + ##------------------------------------------------------------------------------
479 + ##
480 + ##
481 + getPyenv()
482 + {
483 + ## Conda environment
484 + if [ -n "$CONDA_DEFAULT_ENV" ]; then
485 + echo "$CONDA_DEFAULT_ENV"
486 + ## Python virtual environment
487 + elif [ -n "${VIRTUAL_ENV:-}" ]; then
488 + local regex='PS1=\"\((.*?)\)\s\$\{PS1'
489 + local pyenv=$(cat $VIRTUAL_ENV/bin/activate |\
490 + perl -n -e"/$regex/ && print \$1" 2> /dev/null)
491 + if [ -z "${pyenv}" ]; then
492 + local pyenv=$(basename ${VIRTUAL_ENV})
493 + fi
494 + echo "$pyenv"
495 + fi
496 + }
497 + ##------------------------------------------------------------------------------
498 + ##
499 + ##
500 + getKube()
501 + {
502 + type kubectl &>/dev/null && \
503 + type yq &>/dev/null && \
504 + echo -n "$(kubectl config view | yq '.contexts[].context.cluster |select(.contexts[].name == .current-context)' | head -n 1)"
505 + }
506 + ##------------------------------------------------------------------------------
507 + ##
508 + ## Print each word of the propmpt, i.e., a small text acompanied by the
509 + ## separator character and formated with colors and background.
510 + ##
511 + printSegment()
512 + {
513 + ## GET PARAMETERS
514 + local text=$1
515 + local font_color=$2
516 + local background_color=$3
517 + local next_background_color=$4 # needed for the separator, it participates in this and the next text segment
518 + local font_effect=$5
519 + ## COMPUTE COLOR FORMAT CODES
520 + local no_color="\[$(getFormatCode -e reset)\]"
521 + local text_format="\[$(getFormatCode -c $font_color -b $background_color -e $font_effect)\]"
522 + local separator_format="\[$(getFormatCode -c $background_color -b $next_background_color)\]"
523 + ## GENERATE TEXT
524 + printf "${text_format}${segment_padding}${text}${segment_padding}${separator_padding_left}${separator_format}${separator_char}${separator_padding_right}${no_color}"
525 + }
526 + ##------------------------------------------------------------------------------
527 + ##
528 + ##
529 + get_colors_for_element()
530 + {
531 + case $1 in
532 + "USER") echo "${SSP_COLORS_USER[@]}" ;;
533 + "HOST") echo "${SSP_COLORS_HOST[@]}" ;;
534 + "PWD") echo "${SSP_COLORS_PWD[@]}" ;;
535 + "GIT") echo "${SSP_COLORS_GIT[@]}" ;;
536 + "PYENV") echo "${SSP_COLORS_PYENV[@]}";;
537 + "KUBE") echo "${SSP_COLORS_KUBE[@]}";;
538 + "TF") echo "${SSP_COLORS_TF[@]}" ;;
539 + "CLOCK") echo "${SSP_COLORS_CLOCK[@]}";;
540 + "DATE") echo "${SSP_COLORS_DATE[@]}";;
541 + "INPUT") echo "${SSP_COLORS_INPUT[@]}";;
542 + *)
543 + esac
544 + }
545 + ##------------------------------------------------------------------------------
546 + ##
547 + ##
548 + combine_elements()
549 + {
550 + local first=$1
551 + local second=$2
552 + local colors_first=($(get_colors_for_element $first))
553 + local colors_second=($(get_colors_for_element $second))
554 + case $first in
555 + "USER") local text="$user" ;;
556 + "HOST") local text="$host" ;;
557 + "PWD") local text="$path" ;;
558 + "GIT") local text="$git_branch" ;;
559 + "PYENV") local text="$pyenv" ;;
560 + "KUBE") local text="$kube" ;;
561 + "TF") local text="$tf" ;;
562 + "CLOCK") local text="$clock" ;;
563 + "DATE") local text="$date" ;;
564 + "INPUT") local text="" ;;
565 + *) local text="" ;;
566 + esac
567 + local text_color=${colors_first[0]}
568 + local bg_color=${colors_first[1]}
569 + local next_bg_color=${colors_second[1]}
570 + local text_effect=${colors_first[2]}
571 + printSegment "$text" "$text_color" "$bg_color" "$next_bg_color" "$text_effect"
572 + }
573 + ##==============================================================================
574 + ## HOOK
575 + ##==============================================================================
576 + prompt_command_hook()
577 + {
578 + ## GET PARAMETERS
579 + ## This might be a bit redundant, but it makes it easier to maintain
580 + local elements=(${SSP_ELEMENTS[@]})
581 + local user=$USER
582 + local host=$HOSTNAME
583 + local path=$PWD
584 + local git_branch="$(getGitBranch)"
585 + local pyenv="$(getPyenv)"
586 + local kube="$(getKube)"
587 + local tf="$(getTerraform)"
588 + local clock="$(date +"${SSP_CLOCK_FORMAT}")"
589 + local date="$(date +"${SSP_DATE_FORMAT}")"
590 + ## ADAPT DYNAMICALLY ELEMENTS TO BE SHOWN
591 + ## Check if elements such as GIT and the Python environment should be
592 + ## shown and adapt the variables as needed. This usually implies removing
593 + ## the appropriate field from the "elements" array if the user set them
594 + if [ -z "$git_branch" ]; then
595 + elements=( ${elements[@]/"GIT"} ) # Remove GIT from elements to be shown
596 + fi
597 + if [ -z "$pyenv" ]; then
598 + elements=( ${elements[@]/"PYENV"} ) # Remove PYENV from elements to be shown
599 + fi
600 + if [ -z "$tf" ]; then
601 + elements=( ${elements[@]/"TF"} ) # Remove TF from elements to be shown
602 + fi
603 + if [ -z "$kube" ]; then
604 + elements=( ${elements[@]/"KUBE"} ) # Remove KUBE from elements to be shown
605 + fi
606 + ## WINDOW TITLE
607 + ## Prevent messed up terminal-window titles, must be set in the PS1 variable
608 + case $TERM in
609 + xterm*|rxvt*)
610 + SSP_PWD="$path"
611 + local titlebar="\[\033]0;\${USER}@\${HOSTNAME}: \${SSP_PWD}\007\]"
612 + ;;
613 + *)
614 + local titlebar=""
615 + ;;
616 + esac
617 + ## CONSTRUCT PROMPT ITERATIVELY
618 + ## Iterate through all elements to be shown and combine them. Stop once only
619 + ## 1 element is left, which should be the "INPUT" element; then apply the
620 + ## INPUT formatting.
621 + ## Notice that this reuses the PS1 variables over and over again, and appends
622 + ## all extra formatting elements to the end of it.
623 + PS1="${titlebar}${SSP_VERTICAL_PADDING}${SSP_NEW_LINE_LINK_TOP}"
624 + while [ "${#elements[@]}" -gt 1 ]; do
625 + local current=${elements[0]}
626 + local next=${elements[1]}
627 + local elements=("${elements[@]:1}") #remove the 1st element
628 + PS1="$PS1$(combine_elements $current $next)"
629 + done
630 + local input_colors=($(get_colors_for_element ${elements[0]}))
631 + local input_color=${input_colors[0]}
632 + local input_bg=${input_colors[1]}
633 + local input_effect=${input_colors[2]}
634 + local input_format="\[$(getFormatCode -c $input_color -b $input_bg -e $input_effect)\]"
635 + local command_start_symbol="${input_format}${SSP_BASH_SYMBOL}"
636 + ## the prompt is then the prompt we build above, the separation between prompt and command and in
637 + ## the case of a new line inbetween, the corresponding link and $ symbol to start the command.
638 + PS1="${PS1}${SSP_PROMPT_COMM_SEP}${SSP_NEW_LINE_LINK_BOTTOM}${command_start_symbol} $input_format"
639 + ## Once this point is reached, PS1 is formatted and set. The terminal session
640 + ## will then use that variable to prompt the user :)
641 + }
642 + ##==============================================================================
643 + ## MAIN
644 + ##==============================================================================
645 + ## PADDING
646 + if $enable_vertical_padding; then
647 + local vertical_padding="\n"
648 + else
649 + local vertical_padding=""
650 + fi
651 + ## NEW LINE
652 + if $enable_command_on_new_line; then
653 + local new_line_link_top="╭"
654 + local new_line_link_bottom="╰>"
655 + local prompt_command_separation="\n"
656 + local bash_symbol="\$"
657 + else
658 + local new_line_link_top=""
659 + local new_line_link_top=""
660 + local prompt_command_separation=""
661 + local bash_symbol=""
662 + fi
663 + ## CONFIG FOR "prompt_command_hook()"
664 + SSP_ELEMENTS=($format "INPUT") # Append INPUT to elements that have to be shown
665 + SSP_COLORS_USER=($font_color_user $background_user $texteffect_user)
666 + SSP_COLORS_HOST=($font_color_host $background_host $texteffect_host)
667 + SSP_COLORS_PWD=($font_color_pwd $background_pwd $texteffect_pwd)
668 + SSP_COLORS_GIT=($font_color_git $background_git $texteffect_git)
669 + SSP_COLORS_PYENV=($font_color_pyenv $background_pyenv $texteffect_pyenv)
670 + SSP_COLORS_KUBE=($font_color_kube $background_kube $texteffect_kube)
671 + SSP_COLORS_TF=($font_color_tf $background_tf $texteffect_tf)
672 + SSP_COLORS_CLOCK=($font_color_clock $background_clock $texteffect_clock)
673 + SSP_COLORS_DATE=($font_color_date $background_date $texteffect_date)
674 + SSP_COLORS_INPUT=($font_color_input $background_input $texteffect_input)
675 + SSP_VERTICAL_PADDING=$vertical_padding
676 + SSP_NEW_LINE_LINK_TOP=$new_line_link_top
677 + SSP_NEW_LINE_LINK_BOTTOM=$new_line_link_bottom
678 + SSP_PROMPT_COMM_SEP=$prompt_command_separation
679 + SSP_BASH_SYMBOL=$bash_symbol
680 + SSP_MAX_PWD_CHAR=${max_pwd_char:-25}
681 + SSP_GIT_SYNCED=$git_symbol_synced
682 + SSP_GIT_AHEAD=$git_symbol_unpushed
683 + SSP_GIT_BEHIND=$git_symbol_unpulled
684 + SSP_GIT_DIVERGED=$git_symbol_unpushedunpulled
685 + SSP_GIT_DIRTY=$git_symbol_dirty
686 + SSP_GIT_DIRTY_AHEAD=$git_symbol_dirty_unpushed
687 + SSP_GIT_DIRTY_BEHIND=$git_symbol_dirty_unpulled
688 + SSP_GIT_DIRTY_DIVERGED=$git_symbol_dirty_unpushedunpulled
689 + SSP_GIT_STASH=$git_symbol_stash
690 + SSP_GIT_UPDATE_PERIOD_MINUTES=$git_update_period_minutes
691 + SSP_CLOCK_FORMAT=${clock_format:-"%H:%M:%S"}
692 + SSP_DATE_FORMAT=${date_format:-"%A, %d %B %Y"}
693 + ## For terminal line coloring, leaving the rest standard
694 + none="$(tput sgr0)"
695 + trap 'echo -ne "${none}"' DEBUG
696 + ## ADD HOOK TO UPDATE PS1 AFTER EACH COMMAND
697 + ## Bash provides an environment variable called PROMPT_COMMAND.
698 + ## The contents of this variable are executed as a regular Bash command
699 + ## just before Bash displays a prompt.
700 + ## We want it to call our own command to truncate PWD and store it in NEW_PWD
701 + PROMPT_COMMAND=prompt_command_hook
702 + } # synth_shell_prompt()
703 + ##------------------------------------------------------------------------------
704 + ##
705 + ## CALL SCRIPT FUNCTION
706 + ## - CHECK IF SCRIPT IS _NOT_ BEING SOURCED
707 + ## - CHECK IF COLOR SUPPORTED
708 + ## - Check if compliant with Ecma-48 (ISO/IEC-6429)
709 + ## - Call script
710 + ## - Unset script
711 + ## If not running interactively, don't do anything
712 + if [ "${BASH_SOURCE[0]}" == "${0}" ]; then
713 + echo -e "Do not run this script, it will do nothing.\nPlease source it instead by running:\n"
714 + echo -e "\t. ${BASH_SOURCE[0]}\n"
715 + exit
716 + elif [ -n "$( echo $- | grep i )" ]; then
717 + if command -v tput >/dev/null 2>&1 && tput setaf 1 >&/dev/null; then
718 + synth_shell_prompt
719 + fi
720 + unset synth_shell_prompt
721 + unset include
722 + fi
更新 更早