source /etc/profile export PATH=$PATH:~/.local/bin #!/bin/sh ## +-----------------------------------+-----------------------------------+ ## | | ## | FANCY BASH PROMT | ## | | ## | Copyright (c) 2018, Andres Gongora . | ## | | ## | This program is free software: you can redistribute it and/or modify | ## | it under the terms of the GNU General Public License as published by | ## | the Free Software Foundation, either version 3 of the License, or | ## | (at your option) any later version. | ## | | ## | This program is distributed in the hope that it will be useful, | ## | but WITHOUT ANY WARRANTY; without even the implied warranty of | ## | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ## | GNU General Public License for more details. | ## | | ## | You should have received a copy of the GNU General Public License | ## | along with this program. If not, see . | ## | | ## +-----------------------------------------------------------------------+ ## ## DESCRIPTION: ## This script updates your "PS1" environment variable to display colors. ## Addicitionally, it also shortens the name of your current part to maximum ## 25 characters, which is quite useful when working in deeply nested folders. ## ## ## ## INSTALLATION: ## Copy this script to your home folder and rename it to ".fancy-bash-promt.sh" ## Run this command from any terminal: ## echo "source ~/.fancy-bash-promt.sh" >> ~/.bashrc ## ## Alternatively, copy the content of this file into your .bashrc file ## ## ## ## FUNCTIONS: ## ## * bash_prompt_command() ## This function takes your current working directory and stores a shortened ## version in the variable "NEW_PWD". ## ## * format_font() ## A small helper function to generate color formating codes from simple ## number codes (defined below as local variables for convenience). ## ## * bash_prompt() ## This function colorizes the bash promt. The exact color scheme can be ## configured here. The structure of the function is as follows: ## 1. A. Definition of available colors for 16 bits. ## 1. B. Definition of some colors for 256 bits (add your own). ## 2. Configuration >> EDIT YOUR PROMT HERE<<. ## 4. Generation of color codes. ## 5. Generation of window title (some terminal expect the first ## part of $PS1 to be the window title) ## 6. Formating of the bash promt ($PS1). ## ## * Main script body: ## It calls the adequate helper functions to colorize your promt and sets ## a hook to regenerate your working directory "NEW_PWD" when you change it. ## ################################################################################ ## FUNCTIONS ## ################################################################################ ## ## ARRANGE $PWD AND STORE IT IN $NEW_PWD ## * The home directory (HOME) is replaced with a ~ ## * The last pwdmaxlen characters of the PWD are displayed ## * Leading partial directory names are striped off ## /home/me/stuff -> ~/stuff (if USER=me) ## /usr/share/big_dir_name -> ../share/big_dir_name (if pwdmaxlen=20) ## ## Original source: WOLFMAN'S color bash promt ## https://wiki.chakralinux.org/index.php?title=Color_Bash_Prompt#Wolfman.27s ## bash_prompt_command() { # How many characters of the $PWD should be kept local pwdmaxlen=25 # Indicate that there has been dir truncation local trunc_symbol=".." # Store local dir local dir=${PWD##*/} # Which length to use pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen )) NEW_PWD=${PWD/#$HOME/\~} local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen )) # Generate name if [ ${pwdoffset} -gt "0" ] then NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen} NEW_PWD=${trunc_symbol}/${NEW_PWD#*/} fi } ## ## GENERATE A FORMAT SEQUENCE ## format_font() { ## FIRST ARGUMENT TO RETURN FORMAT STRING local output=$1 case $# in 2) eval $output="'\[\033[0;${2}m\]'" ;; 3) eval $output="'\[\033[0;${2};${3}m\]'" ;; 4) eval $output="'\[\033[0;${2};${3};${4}m\]'" ;; *) eval $output="'\[\033[0m\]'" ;; esac } ## ## COLORIZE BASH PROMT ## bash_prompt() { ############################################################################ ## COLOR CODES ## ## These can be used in the configuration below ## ############################################################################ ## FONT EFFECT local NONE='0' local BOLD='1' local DIM='2' local UNDERLINE='4' local BLINK='5' local INVERT='7' local HIDDEN='8' ## COLORS local DEFAULT='9' local BLACK='0' local RED='1' local GREEN='2' local YELLOW='3' local BLUE='4' local MAGENTA='5' local CYAN='6' local L_GRAY='7' local D_GRAY='60' local L_RED='61' local L_GREEN='62' local L_YELLOW='63' local L_BLUE='64' local L_MAGENTA='65' local L_CYAN='66' local WHITE='67' ## TYPE local RESET='0' local EFFECT='0' local COLOR='30' local BG='40' ## 256 COLOR CODES local NO_FORMAT="\[\033[0m\]" local ORANGE_BOLD="\[\033[1;38;5;208m\]" local TOXIC_GREEN_BOLD="\[\033[1;38;5;118m\]" local RED_BOLD="\[\033[1;38;5;1m\]" local CYAN_BOLD="\[\033[1;38;5;87m\]" local BLACK_BOLD="\[\033[1;38;5;0m\]" local WHITE_BOLD="\[\033[1;38;5;15m\]" local GRAY_BOLD="\[\033[1;90m\]" local BLUE_BOLD="\[\033[1;38;5;74m\]" ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## CONFIGURE HERE ## ############################################################################ ## CONFIGURATION ## ## Choose your color combination here ## ############################################################################ local FONT_COLOR_1=$WHITE local BACKGROUND_1=$BLUE local TEXTEFFECT_1=$BOLD local FONT_COLOR_2=$WHITE local BACKGROUND_2=$L_BLUE local TEXTEFFECT_2=$BOLD local FONT_COLOR_3=$D_GRAY local BACKGROUND_3=$WHITE local TEXTEFFECT_3=$BOLD local PROMT_FORMAT=$BLUE_BOLD ############################################################################ ## EXAMPLE CONFIGURATIONS ## ## I use them for different hosts. Test them out ;) ## ############################################################################ ## CONFIGURATION: BLUE-WHITE if [ "$HOSTNAME" = dell ]; then FONT_COLOR_1=$WHITE; BACKGROUND_1=$BLUE; TEXTEFFECT_1=$BOLD FONT_COLOR_2=$WHITE; BACKGROUND_2=$L_BLUE; TEXTEFFECT_2=$BOLD FONT_COLOR_3=$D_GRAY; BACKGROUND_3=$WHITE; TEXTEFFECT_3=$BOLD PROMT_FORMAT=$CYAN_BOLD fi ## CONFIGURATION: BLACK-RED if [ "$HOSTNAME" = giraff6 ]; then FONT_COLOR_1=$WHITE; BACKGROUND_1=$BLACK; TEXTEFFECT_1=$BOLD FONT_COLOR_2=$WHITE; BACKGROUND_2=$D_GRAY; TEXTEFFECT_2=$BOLD FONT_COLOR_3=$WHITE; BACKGROUND_3=$RED; TEXTEFFECT_3=$BOLD PROMT_FORMAT=$RED_BOLD fi ## CONFIGURATION: RED-BLACK #FONT_COLOR_1=$WHITE; BACKGROUND_1=$RED; TEXTEFFECT_1=$BOLD #FONT_COLOR_2=$WHITE; BACKGROUND_2=$D_GRAY; TEXTEFFECT_2=$BOLD #FONT_COLOR_3=$WHITE; BACKGROUND_3=$BLACK; TEXTEFFECT_3=$BOLD #PROMT_FORMAT=$RED_BOLD ## CONFIGURATION: CYAN-BLUE if [ "$HOSTNAME" = sharkoon ]; then FONT_COLOR_1=$BLACK; BACKGROUND_1=$L_CYAN; TEXTEFFECT_1=$BOLD FONT_COLOR_2=$WHITE; BACKGROUND_2=$L_BLUE; TEXTEFFECT_2=$BOLD FONT_COLOR_3=$WHITE; BACKGROUND_3=$BLUE; TEXTEFFECT_3=$BOLD PROMT_FORMAT=$CYAN_BOLD fi ## CONFIGURATION: GRAY-SCALE if [ "$HOSTNAME" = giraff ]; then FONT_COLOR_1=$WHITE; BACKGROUND_1=$BLACK; TEXTEFFECT_1=$BOLD FONT_COLOR_2=$WHITE; BACKGROUND_2=$D_GRAY; TEXTEFFECT_2=$BOLD FONT_COLOR_3=$WHITE; BACKGROUND_3=$L_GRAY; TEXTEFFECT_3=$BOLD PROMT_FORMAT=$BLACK_BOLD fi ## CONFIGURATION: GRAY-CYAN if [ "$HOSTNAME" = light ]; then FONT_COLOR_1=$WHITE; BACKGROUND_1=$BLACK; TEXTEFFECT_1=$BOLD FONT_COLOR_2=$WHITE; BACKGROUND_2=$D_GRAY; TEXTEFFECT_2=$BOLD FONT_COLOR_3=$BLACK; BACKGROUND_3=$L_CYAN; TEXTEFFECT_3=$BOLD PROMT_FORMAT=$CYAN_BOLD fi ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ############################################################################ ## TEXT FORMATING ## ## Generate the text formating according to configuration ## ############################################################################ ## CONVERT CODES: add offset FC1=$(($FONT_COLOR_1+$COLOR)) BG1=$(($BACKGROUND_1+$BG)) FE1=$(($TEXTEFFECT_1+$EFFECT)) FC2=$(($FONT_COLOR_2+$COLOR)) BG2=$(($BACKGROUND_2+$BG)) FE2=$(($TEXTEFFECT_2+$EFFECT)) FC3=$(($FONT_COLOR_3+$COLOR)) BG3=$(($BACKGROUND_3+$BG)) FE3=$(($TEXTEFFECT_3+$EFFECT)) FC4=$(($FONT_COLOR_4+$COLOR)) BG4=$(($BACKGROUND_4+$BG)) FE4=$(($TEXTEFFECT_4+$EFFECT)) ## CALL FORMATING HELPER FUNCTION: effect + font color + BG color local TEXT_FORMAT_1 local TEXT_FORMAT_2 local TEXT_FORMAT_3 local TEXT_FORMAT_4 format_font TEXT_FORMAT_1 $FE1 $FC1 $BG1 format_font TEXT_FORMAT_2 $FE2 $FC2 $BG2 format_font TEXT_FORMAT_3 $FC3 $FE3 $BG3 format_font TEXT_FORMAT_4 $FC4 $FE4 $BG4 # GENERATE PROMT SECTIONS local PROMT_USER=$"$TEXT_FORMAT_1 \u " local PROMT_HOST=$"$TEXT_FORMAT_2 \h " local PROMT_PWD=$"$TEXT_FORMAT_3 \${NEW_PWD} " local PROMT_INPUT=$"$PROMT_FORMAT " ############################################################################ ## SEPARATOR FORMATING ## ## Generate the separators between sections ## ## Uses background colors of the sections ## ############################################################################ ## CONVERT CODES TSFC1=$(($BACKGROUND_1+$COLOR)) TSBG1=$(($BACKGROUND_2+$BG)) TSFC2=$(($BACKGROUND_2+$COLOR)) TSBG2=$(($BACKGROUND_3+$BG)) TSFC3=$(($BACKGROUND_3+$COLOR)) TSBG3=$(($DEFAULT+$BG)) ## CALL FORMATING HELPER FUNCTION: effect + font color + BG color local SEPARATOR_FORMAT_1 local SEPARATOR_FORMAT_2 local SEPARATOR_FORMAT_3 format_font SEPARATOR_FORMAT_1 $TSFC1 $TSBG1 format_font SEPARATOR_FORMAT_2 $TSFC2 $TSBG2 format_font SEPARATOR_FORMAT_3 $TSFC3 $TSBG3 # GENERATE SEPARATORS WITH FANCY TRIANGLE local TRIANGLE=$'\uE0B0' local SEPARATOR_1=$SEPARATOR_FORMAT_1$TRIANGLE local SEPARATOR_2=$SEPARATOR_FORMAT_2$TRIANGLE local SEPARATOR_3=$SEPARATOR_FORMAT_3$TRIANGLE ############################################################################ ## WINDOW TITLE ## ## Prevent messed up terminal-window titles ## ############################################################################ case $TERM in xterm*|rxvt*) local TITLEBAR='\[\033]0;\u:${NEW_PWD}\007\]' ;; *) local TITLEBAR="" ;; esac ############################################################################ ## BASH PROMT ## ## Generate promt and remove format from the rest ## ############################################################################ PS1="$TITLEBAR\n${PROMT_USER}${SEPARATOR_1}${PROMT_HOST}${SEPARATOR_2}${PROMT_PWD}${SEPARATOR_3}${PROMT_INPUT}" ## For terminal line coloring, leaving the rest standard none="$(tput sgr0)" trap 'echo -ne "${none}"' DEBUG } ################################################################################ ## MAIN ## ################################################################################ ## Bash provides an environment variable called PROMPT_COMMAND. ## The contents of this variable are executed as a regular Bash command ## just before Bash displays a prompt. ## We want it to call our own command to truncate PWD and store it in NEW_PWD PROMPT_COMMAND=bash_prompt_command ## Call bash_promnt only once, then unset it (not needed any more) ## It will set $PS1 with colors and relative to $NEW_PWD, ## which gets updated by $PROMT_COMMAND on behalf of the terminal bash_prompt unset bash_prompt ### EOF ###