418 lines
13 KiB
Bash
418 lines
13 KiB
Bash
source /etc/profile
|
|
export PATH=$PATH:~/.local/bin
|
|
|
|
#!/bin/sh
|
|
|
|
## +-----------------------------------+-----------------------------------+
|
|
## | |
|
|
## | FANCY BASH PROMT |
|
|
## | |
|
|
## | Copyright (c) 2018, Andres Gongora <mail@andresgongora.com>. |
|
|
## | |
|
|
## | 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 <http://www.gnu.org/licenses/>. |
|
|
## | |
|
|
## +-----------------------------------------------------------------------+
|
|
|
|
|
|
##
|
|
## 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 ###
|