diff --git a/bin/__build_sgr_code b/bin/__build_sgr_code index 0b025e9..60ed83f 100755 --- a/bin/__build_sgr_code +++ b/bin/__build_sgr_code @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/sh # This script will take an HTML compatible hex colour string and turn it into # a terminal sequence for true colour and other formats which best approximate @@ -13,84 +13,107 @@ debug=0 +debug_print() +{ + if [ ${debug} -ne 0 ] + then + echo ${*} >&2 + fi +} + # This is the named color map. Just add new entries and they'll be supported... -declare -A map -map[white]="FFFFFF" -map[silver]="C0C0C0" -map[gray]="808080" -map[grey]="808080" -map[black]="000000" -map[red]="FF0000" -map[maroon]="800000" -map[yellow]="FFFF00" -map[olive]="808000" -map[lime]="00FF00" -map[green]="008000" -map[aqua]="00FFFF" -map[teal]="008080" -map[blue]="0000FF" -map[navy]="000080" -map[fuchsia]="FF00FF" -map[purple]="800080" +COLOR_TABLE="" + +map() +{ + if [ $# -eq 2 ] + then + COLOR_TABLE="${COLOR_TABLE}:${1}=${2}" + else + ___right="${COLOR_TABLE##*:${1}=}" + echo ${___right%%:*} + fi +} + +map white "FFFFFF" +map silver "C0C0C0" +map gray "808080" +map grey "808080" +map black "000000" +map red "FF0000" +map maroon "800000" +map yellow "FFFF00" +map olive "808000" +map lime "00FF00" +map green "008000" +map aqua "00FFFF" +map teal "008080" +map blue "0000FF" +map navy "000080" +map fuchsia "FF00FF" +map purple "800080" # Some VGA color names can be promoted: -map[brown]="aa5500" -map[cyan]="00aaaa" +map brown "aa5500" +map cyan "00aaaa" # The VGA names can be prefixed with "vga-" to explicitly avoid the collisions with HTML names, above... # Based upon wikipedia's article on ANSI. See the table on that page for details. -map[vga-black]="000000" -map[vga-red]="aa0000" -map[vga-green]="00aa00" -map[vga-brown]="aa5500" -map[vga-yellow]="aa5500" -map[vga-blue]="0000aa" -map[vga-magenta]="aa00aa" -map[vga-cyan]="00aaaa" -map[vga-white]="aaaaaa" +map vga-black "000000" +map vga-red "aa0000" +map vga-green "00aa00" +map vga-brown "aa5500" +map vga-yellow "aa5500" +map vga-blue "0000aa" +map vga-magenta "aa00aa" +map vga-cyan "00aaaa" +map vga-white "aaaaaa" -map[vga-brightblack]="555555" -map[vga-grey]="555555" -map[vga-gray]="555555" -map[vga-brightred]="ff5555" -map[vga-brightgreen]="55ff55" -map[vga-brightyellow]="ffff55" -map[vga-brightblue]="5555ff" -map[vga-brightmagenta]="ff55ff" -map[vga-brightcyan]="55ffff" -map[vga-brightwhite]="ffffff" +map vga-brightblack "555555" +map vga-grey "555555" +map vga-gray "555555" +map vga-brightred "ff5555" +map vga-brightgreen "55ff55" +map vga-brightyellow "ffff55" +map vga-brightblue "5555ff" +map vga-brightmagenta "ff55ff" +map vga-brightcyan "55ffff" +map vga-brightwhite "ffffff" enable_greyscale_cheat=0 nocsi=0 -if [[ $1 == "no-csi" ]] +if [ "$1" = "no-csi" ] then nocsi=1 shift 1 fi -function dump_colors() +dump_colors() { - for key in ${!map[@]} + all_maps=$(echo ${COLOR_TABLE} | sed -e 's/:/ /g' -e 's/=[0-9a-fA-F]\{6\}//g') + debug_print "Going through all these colors ${all_maps} (${COLOR_TABLE})" + for key in ${all_maps} do + debug_print "Processing key ${key}" case $key in *bright*) text_color="000000" ;; *black*) text_color="ffffff" ;; *) text_color="000000" ;; esac - printf "%-24s${map[${key}]} |" ${key} + printf "%-24s$(map ${key} ) |" ${key} printf "`$0 reset reverse bg:${text_color} fg:${key}`native-sample`$0 reset`|" - if [[ ! -v CSHENV_TERMINAL_COLORS ]] || (( ${CSHENV_TERMINAL_COLORS} >= 256 )) + if [ -z "${CSHENV_TERMINAL_COLORS+x}" ] || [ ${CSHENV_TERMINAL_COLORS} -ge 256 ] then printf "`env CSHENV_TERMINAL_COLORS=256 $0 reset reverse bg:${text_color} fg:${key}`8-bit sample`$0 reset`|" fi - if [[ ! -v CSHENV_TERMINAL_COLORS ]] || (( ${CSHENV_TERMINAL_COLORS} >= 16 )) + if [ -z "${CSHENV_TERMINAL_COLORS+x}" ] || [ ${CSHENV_TERMINAL_COLORS} -ge 16 ] then printf "`env CSHENV_TERMINAL_COLORS=16 $0 reset reverse bg:${text_color} fg:${key}`4-bit sample`$0 reset`|" fi - if [[ ! -v CSHENV_TERMINAL_COLORS ]] || (( ${CSHENV_TERMINAL_COLORS} >= 8 )) + if [ -z "${CSHENV_TERMINAL_COLORS+x}" ] || [ ${CSHENV_TERMINAL_COLORS} -ge 8 ] then printf "`env CSHENV_TERMINAL_COLORS=8 $0 reset reverse bg:${text_color} fg:${key}`3-bit sample`$0 reset`|" fi @@ -100,19 +123,19 @@ function dump_colors() exit 0 } -function cube_row() +cube_row() { r_base=${1} g=0 - while (( g < 6 )) + while [ ${g} -lt 6 ] do u=0 - while (( u < 3 )) + while [ ${u} -lt 3 ] do r=$(( r_base + u )) b=0 - while (( b < 6 )) + while [ ${b} -lt 6 ] do i=$(( 16 + ( r * 36 ) + ( g * 6 ) + ( b ) )) @@ -135,12 +158,12 @@ function cube_row() printf '\n' } -function greyscale_chart() +greyscale_chart() { [ ${i} -ge 244 ] && txt=";30" local k=$(( i + 12 )) - while (( i < k )) + while [ ${i} -lt ${k} ] do printf "[48;5;${i};37;1${txt}m%3i " ${i} i=$(( i + 1 )) @@ -148,12 +171,12 @@ function greyscale_chart() printf '\n' } -function color_chart() +color_chart() { i=0 # Base 16 - while (( i < 16 )) + while [ ${i} -lt 16 ] do [ ${i} -gt 0 ] && txt=";30" @@ -171,47 +194,47 @@ function color_chart() greyscale_chart } -function setup_color_depth() +setup_color_depth() { use_8_bit=0 use_4_bit=0 use_3_bit=0 # Must only be set if terminal colors are reduced... - if [[ -v CSHENV_TERMINAL_COLORS ]] + if [ "${CSHENV_TERMINAL_COLORS+x}" ] then - if (( ${CSHENV_TERMINAL_COLORS} == 256 )) + if [ ${CSHENV_TERMINAL_COLORS} -eq 256 ] then use_8_bit=1 - elif (( ${CSHENV_TERMINAL_COLORS} == 16 )) + elif [ ${CSHENV_TERMINAL_COLORS} -eq 16 ] then use_4_bit=1 - elif (( ${CSHENV_TERMINAL_COLORS} == 8 )) + elif [ ${CSHENV_TERMINAL_COLORS} -eq 8 ] then use_3_bit=1 else - echo "ERROR!" 1>&2 ; exit -1 + echo "ERROR!" 1>&2 ; exit 255 fi fi } -function render_color() +render_color() { command_color=30 - if (( ${use_3_bit} )) + if [ ${use_3_bit} -ne 0 ] then # Underline colours need 8-bit or more - if (( ${background} > 1 )) ; then return; fi + if [ ${background} -gt 1 ] ; then return; fi basecolor=$(( ${command_color} + ${background}*10)) next="$(( ${basecolor} + ${legacy_3_bit} ))" - elif (( ${use_4_bit} )) + elif [ ${use_4_bit} -ne 0 ] then # Underline colours need 8-bit or more - if (( ${background} > 1 )) ; then return; fi + if [ ${background} -gt 1 ] ; then return; fi command_color=$(( ${command_color} + ${intensity_1_bit} * 60 )) basecolor=$(( ${command_color} + ${background}*10 )) next="$(( ${basecolor} + ${legacy_3_bit} ))" - elif (( ${use_8_bit} )) + elif [ ${use_8_bit} -ne 0 ] then basecolor=$(( 8 + ${command_color} + ${background}*10 )) next="${basecolor};5;${ext_8_bit}" @@ -223,12 +246,12 @@ function render_color() -function ansi_color() +ansi_color() { - if (( ${1} > 15 )) + if [ ${1} -gt 15 ] then - echo "ERROR!" 1>&2 ; exit -1 - elif (( ${1} >= 8 )) + echo "ERROR!" 1>&2 ; exit 255 + elif [ ${1} -ge 8 ] then use_4_bit=1 intensity_1_bit=1 @@ -240,58 +263,65 @@ function ansi_color() fi } -function ext_grey() +ext_grey() { use_8_bit=1 grey_val=${1} - if (( ${grey_val} < 0 || ${grey_val} > 23 )) + if [ ${grey_val} -le 0 - ${grey_val} -gt 23 ] then - echo "ERROR!" 1>&2 ; exit -1 + echo "ERROR!" 1>&2 ; exit 255 fi ext_8_bit=$(( 232 + ${grey_val} )) } -function ext_rgb() +ext_rgb() { use_8_bit=1 - red_ext_val=$((6#${1:0:1})) - green_ext_val=$((6#${1:1:1})) - blue_ext_val=$((6#${1:2:1})) + red_ext_val="${1%??*}" + tmp="${1#?}" + green_ext_val=${tmp%?*} + blue_ext_val=${tmp#?*} ext_8_bit=$(( 16 + 36 * ${red_ext_val} + 6 * ${green_ext_val} + ${blue_ext_val} )) } -function ext_color() +ext_color() { use_8_bit=1 - if (( ${1} > 255 )) + if [ ${1} -gt 255 ] then - echo "ERROR!" 1>&2 ; exit -1 + echo "ERROR!" 1>&2 ; exit 255 else ext_8_bit=${1} fi } -function rgb_color() +rgb_color() { color=$1 case $1 in - [0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) color=${1:0:1}${1:0:1}${1:1:1}${1:1:1}${1:2:1}${1:2:1} ;; + [0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) + tmp="${color}" + color="${tmp%??*}${tmp%??*}" + tmp="${tmp#?}" + color="${color}${tmp%?*}${tmp%?*}${tmp#?}${tmp#?}" + ;; esac # First split off the red, green, and blue components... - red_hex=${color:0:2} - green_hex=${color:2:2} - blue_hex=${color:4:2} + red_hex="0x${color%????}" + color="${color#??}" + green_hex="0x${color%??}" + blue_hex="0x${color#??}" # Convert to decimal... - red_dec=$((16#${red_hex})) - green_dec=$((16#${green_hex})) - blue_dec=$((16#${blue_hex})) + red_dec=$((${red_hex})) + green_dec=$((${green_hex})) + blue_dec=$((${blue_hex})) - if (( ${debug} != 0 )) - then - echo "Red: $red_dec" - echo "Green: $green_dec" - echo "Blue: $blue_dec" + if [ ${debug} -ne 0 ] + then + debug_print "Red: $red_dec" + debug_print "Green: $green_dec" + debug_print "Blue: $blue_dec" fi # Now compute the rest of the stuff... @@ -311,22 +341,22 @@ function rgb_color() # If we can support an intensity bit, we'll turn that on too... # But we're going to stop using bold to set the colour "intense" # We'll use the 9x and 10x forms... - if (( ${red_dec} >= 192 || ${green_dec} >= 192 || ${blue_dec} >= 192 )) + if [ ${red_dec} -ge 192 -o ${green_dec} -ge 192 -o ${blue_dec} -ge 192 ] then intensity_1_bit=1 fi - if (( ${debug} != 0 )) + if [ ${debug} -ne 0 ] then - echo "Red bit: " $red_1_bit - echo "Green bit: " $green_1_bit - echo "Blue bit: " $blue_1_bit - echo "Intensity bit: " $intensity_1_bit + debug_print "Red bit: " $red_1_bit + debug_print "Green bit: " $green_1_bit + debug_print "Blue bit: " $blue_1_bit + debug_print "Intensity bit: " $intensity_1_bit fi # Because grey is tricky, I'm going to special case it: - if (( 1 && ${red_dec} == ${green_dec} && ${green_dec} == ${blue_dec} && ${red_dec} < 128 && ${red_dec} >= 80 )) + if [ ${red_dec} -eq ${green_dec} -a ${green_dec} -eq ${blue_dec} -a ${red_dec} -lt 128 -a ${red_dec} -ge 80 ] then red_1_bit=0 green_1_bit=0 @@ -335,28 +365,28 @@ function rgb_color() fi # Because brown is tricky, I'm going to special case it: - if (( ${red_dec} > 128 && ${green_dec} > 80 && ${blue_dec} < 50 )) + if [ ${red_dec} -gt 128 -a ${green_dec} -gt 80 -a ${blue_dec} -lt 50 ] then red_1_bit=1 green_1_bit=1 blue_1_bit=0 fi - if (( ${debug} != 0 )) + if [ ${debug} -ne 0 ] then - echo "Red bit: " $red_1_bit - echo "Green bit: " $green_1_bit - echo "Blue bit: " $blue_1_bit - echo "Intensity bit: " $intensity_1_bit - fi + debug_print "Red bit: " $red_1_bit + debug_print "Green bit: " $green_1_bit + debug_print "Blue bit: " $blue_1_bit + debug_print "Intensity bit: " $intensity_1_bit + fi # This lets us combine them for a legacy colour value in the legacy colour space... legacy_3_bit=$(( ( ${blue_1_bit} << 2 ) + ( ${green_1_bit} << 1 ) + ( ${red_1_bit} ) )) - if (( ${debug} != 0 )) + if [ ${debug} -ne 0 ] then - echo "Legacy colour: " ${legacy_3_bit} " Intensity: " ${intensity_1_bit} + debug_print "Legacy colour: " ${legacy_3_bit} " Intensity: " ${intensity_1_bit} fi # Now compute an extended colour cube placement (216 colours): @@ -365,35 +395,35 @@ function rgb_color() green_ext_val=$(( ${green_dec} * 6 / 256 )) blue_ext_val=$(( ${blue_dec} * 6 / 256 )) - if (( ${debug} != 0 )) + if [ ${debug} -ne 0 ] then - echo "Red ext: " ${red_ext_val} - echo "Green ext: " ${green_ext_val} - echo "Blue ext: " ${blue_ext_val} + debug_print "Red ext: " ${red_ext_val} + debug_print "Green ext: " ${green_ext_val} + debug_print "Blue ext: " ${blue_ext_val} fi ext_8_bit=$(( 16 + 36 * ${red_ext_val} + 6 * ${green_ext_val} + ${blue_ext_val} )) - if (( ${debug} )) + if [ ${debug} -ne 0 ] then - echo "Computed 216 color cube: " ${ext_8_bit} + debug_print "Computed 216 color cube: " ${ext_8_bit} fi # Check for precise greyscale, which would replace the above: # (Note that precise greyscale is implied by a user explicitly making ALL of RGB the # same value, thus demanding greyscale, rather than a subtle tinting...) - if (( ${red_dec} == ${green_dec} && ${green_dec} == ${blue_dec} )) + if [ ${red_dec} -eq ${green_dec} -a ${green_dec} -eq ${blue_dec} ] then ext_8_bit=$(( 232 + ${red_dec} * 24 / 256 )) fi - if (( ${debug} )) + if [ ${debug} -ne 0 ] then - echo "Computed 256 color choice, after applying greyscale scan: " ${ext_8_bit} + debug_print "Computed 256 color choice, after applying greyscale scan: " ${ext_8_bit} fi - if (( ${enable_greyscale_cheat} )) + if [ ${enable_greyscale_cheat} -ne 0 ] then # Check for SPECIFIC white and black and grey: # The half-saturation, no saturation, and full saturation values are mapped @@ -403,34 +433,34 @@ function rgb_color() # points in the 6x6x6 colour cube.) # # TODO: Only map the head and tail of the colour cube. - if (( ${red_dec} == ${green_dec} && ${green_dec} == ${blue_dec} )) + if [ ${red_dec} -eq ${green_dec} -a ${green_dec} -eq ${blue_dec} ] then - if (( ${red_dec} == 0 )) + if [ ${red_dec} -eq 0 ] then ext_8_bit=0 - elif (( ${red_dec} == 255 )) + elif [ ${red_dec} -eq 255 ] then ext_8_bit=15 - elif (( ${red_dec} == 128 )) + elif [ ${red_dec} -eq 128 ] then ext_8_bit=8 - elif (( ${red_dec} == 192 )) + elif [ ${red_dec} -eq 192 ] then ext_8_bit=7 fi fi fi - if (( ${debug} )) + if [ ${debug} -ne 0 ] then - echo "Computed 256 color choice, after applying white and black scan: " ${ext_8_bit} + debug_print "Computed 256 color choice, after applying white and black scan: " ${ext_8_bit} fi # We do NOT check for the base colours precisely. Since those 16 can be custom mapped by your terminal emulator, you just pass `ansi:0` thru # `ansi:15` to select them by ID. Or use `ext:0` thru `ext:255` to select a specific extended colour. } -function make_color() +make_color() { setup_color_depth background=$1 # $1 is the background bit @@ -438,19 +468,20 @@ function make_color() render_color } -function named_color() +named_color() { - name=${1,,} - if [[ ! -v map[$name] ]] + name=$( echo ${1} | awk '{print tolower($1)}' ) + mapped=$(map ${name}) + debug_print "${name} -> ${mapped}" + if [ -z "${mapped}" ] then - echo "ERROR!" 1>&2 ; exit -1 + echo "ERROR!" 1>&2 ; exit 255 fi - mapped=${map[$name]} rgb_color ${mapped} } -function build_sgr_code() +build_sgr_code() { case $1 in dump-colors) dump_colors ;; @@ -469,41 +500,43 @@ function build_sgr_code() doubleunder) next=21 ;; reveal) next=28 ;; - ansi:*) make_color 0 ansi_color ${1:5} ;; - ext:grey*) make_color 0 ext_grey ${1:8} ;; - ext:rgb*) make_color 0 ext_rgb ${1:7} ;; - ext:*) make_color 0 ext_color ${1:4} ;; + ansi:*) make_color 0 ansi_color ${1#?????} ;; + ext:grey*) make_color 0 ext_grey ${1#????????} ;; + ext:rgb*) make_color 0 ext_rgb ${1#???????} ;; + ext:*) make_color 0 ext_color ${1#????} ;; # 12-bit color also supported [0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 0 rgb_color $1 ;; [0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 0 rgb_color $1 ;; - fg:ansi:*) make_color 0 ansi_color ${1:8} ;; - fg:ext:grey*) make_color 0 ext_grey ${1:11} ;; - fg:ext:rgb*) make_color 0 ext_rgb ${1:10} ;; - fg:ext:*) make_color 0 ext_color ${1:7} ;; + fg:ansi:*) make_color 0 ansi_color ${1#????????} ;; + fg:ext:grey*) make_color 0 ext_grey ${1#???????????} ;; + fg:ext:rgb*) make_color 0 ext_rgb ${1#??????????} ;; + fg:ext:*) make_color 0 ext_color ${1#???????} ;; # 12-bit color also supported - fg:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 0 rgb_color ${1:3} ;; - fg:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 0 rgb_color ${1:3} ;; + fg:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 0 rgb_color ${1#???} ;; + fg:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 0 rgb_color ${1#???} ;; - bg:ansi:*) make_color 1 ansi_color ${1:8} ;; - bg:ext:grey*) make_color 1 ext_grey ${1:11} ;; - bg:ext:rgb*) make_color 1 ext_rgb ${1:10} ;; - bg:ext:*) make_color 1 ext_color ${1:7} ;; + bg:ansi:*) make_color 1 ansi_color ${1#????????} ;; + bg:ext:grey*) make_color 1 ext_grey ${1#???????????} ;; + bg:ext:rgb*) make_color 1 ext_rgb ${1#??????????} ;; + bg:ext:*) make_color 1 ext_color ${1#???????} ;; # 12-bit color also supported - bg:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 1 rgb_color ${1:3} ;; - bg:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 1 rgb_color ${1:3} ;; + bg:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 1 rgb_color ${1#???} ;; + bg:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 1 rgb_color ${1#???} ;; - ul:ext:*) make_color 2 ext_color ${1:7} ;; + ul:ext:grey*) make_color 2 ext_grey ${1#???????????} ;; + ul:ext:rgb*) make_color 2 ext_rgb ${1#??????????} ;; + ul:ext:*) make_color 2 ext_color ${1#???????} ;; # 12-bit color also supported - ul:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 2 rgb_color ${1:3} ;; - ul:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 2 rgb_color ${1:3} ;; + ul:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 2 rgb_color ${1#???} ;; + ul:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) make_color 2 rgb_color ${1#???} ;; - fg:*) make_color 0 named_color ${1:3} ;; - bg:*) make_color 1 named_color ${1:3} ;; - ul:*) make_color 2 named_color ${1:3} ;; + fg:*) make_color 0 named_color ${1#???} ;; + bg:*) make_color 1 named_color ${1#???} ;; + ul:*) make_color 2 named_color ${1#???} ;; *) make_color 0 named_color $1 ;; esac - if [[ ! -z ${output} ]] + if [ ! -z ${output} ] then output="${output};" fi @@ -511,17 +544,18 @@ function build_sgr_code() } output="" -while [[ ! -z $1 ]] +while [ ! -z $1 ] do build_sgr_code $1 shift 1 done -if [[ ! -z ${output} ]] && (( ! ${nocsi} )) +if [ ! -z "${output}" ] && [ ${nocsi} -ne 1 ] then + #echo "I AM PRINTING WITH CSI! (${nocsi} is nocsi, \`${output}\` is output)">&2 output="[${output}m" fi -if [[ ! -z ${output} ]] +if [ ! -z "${output}" ] then printf ${output} fi diff --git a/startup_hooks/install.sh b/startup_hooks/install.sh index af97d3c..96eafb6 100755 --- a/startup_hooks/install.sh +++ b/startup_hooks/install.sh @@ -3,47 +3,73 @@ # Yeah, my CSHENV Install script is written in Bourne shell. This is because # CSH isn't a great scripting language, but it is a nice interactive shell. -export REALPATH=`realpath $0` -export INSTALLER_LOCATION=`dirname ${REALPATH}` -export CSHENV_LOCATION=`dirname ${INSTALLER_LOCATION}` -export RELATIVE_CSHENV_LOCATION=`realpath --relative-to=${HOME} ${CSHENV_LOCATION}` +export HOMEPATH="$(realpath ~)" +export REALPATH=$(realpath ${0}) +export INSTALLER_LOCATION_REAL=$(dirname ${REALPATH}) +export INSTALLER_LOCATION=$(echo ${INSTALLER_LOCATION_REAL} | sed -e 's,'"${HOMEPATH}"',~,') +export CSHENV_LOCATION_REAL=$(dirname ${INSTALLER_LOCATION_REAL}) +export CSHENV_LOCATION=$(echo ${CSHENV_LOCATION_REAL} | sed -e 's,'"${HOMEPATH}"',~,') +export RELATIVE_CSHENV_LOCATION=$(echo ${CSHENV_LOCATION} | sed -e 's,~/,,') + +export TMP_BASE=$(realpath ~/.cshenv/installer-backup/) +mkdir -p ${TMP_BASE} +#mkdir -p ${TMP_BASE} +export __TMP=$(mktemp -dp ${TMP_BASE}) + +backup_config_file() +{ + __file="${1}" + mkdir -p ${__TMP}/ssh + + echo "Checking for ${__file}" + if [ -e ${__file} ] + then + case ${__file} in + *ssh/config) + echo "Backing up ${__file} to ${__TMP}/ssh" + mv ${__file} ${__TMP}/ssh/$(basename ${__file} | sed -e's/\.//') + ;; + *) + echo "Backing up ${__file} to ${__TMP}" + mv ${__file} ${__TMP}/$(basename ${__file} | sed -e's/\.//') + ;; + esac + else + echo "${__file} does not exist, not backing up anything." + fi +} + +install_shell_file() +{ + __file="${1}" + + backup_config_file ${1} + + echo "Installing ${1}" + echo "source ${CSHENV_LOCATION}/startup_hooks/$(basename ${1} | sed -e's/\.//') "'!#:1' > ${1} +} if [ -v CSHENV_DEBUG_INSTALLER ] then + echo HOMEPATH: $HOMEPATH + echo REALPATH: $REALPATH + echo TMP_BASE: $TMP_BASE + echo __TMP: $__TMP + echo INSTALLER_LOCATION_REAL: $INSTALLER_LOCATION_REAL + echo INSTALLER_LOCATION: $INSTALLER_LOCATION + echo CSHENV_LOCATION: $CSHENV_LOCATION + echo RELATIVE_CSHENV_LOCATION: $RELATIVE_CSHENV_LOCATION echo $CSHENV_LOCATION echo $RELATIVE_CSHENV_LOCATION exit fi -echo "Checking for ~/.login" -if [ ! -e ~/.login ] -then - echo "Installing ~/.login" - echo "setenv CSHENV_DIR ${CSHENV_LOCATION}" >> ~/.login - echo 'source ${CSHENV_DIR}/startup_hooks/login' >> ~/.login -fi +install_shell_file ~/.login -echo "Checking for ~/.tcshrc" -if [ ! -e ~/.tcshrc ] -then - echo "Installing ~/.tcshrc" - echo "setenv CSHENV_DIR ${CSHENV_LOCATION}" >> ~/.tcshrc - echo "setenv CSHENV_HIDE_SHELL_LEVEL_AT_ONE" >> ~/.tcshrc - echo 'source ${CSHENV_DIR}/startup_hooks/tcshrc' >> ~/.tcshrc -fi +install_shell_file ~/.tcshrc -echo "Checking for vim setup" -if [ -e ~/.vimrc ] -then - echo "Relocating vimrc" - mv ~/.vimrc ~/.vim/vimrc.old -fi - -if [ -e ~/.vim ] -then - echo "Relocating vim setup" - mv ~/.vim ~/.vim.old -fi +backup_config_file ~/.vimrc +backup_config_file ~/.vim echo "Installing vim setup" pushd ~ >& /dev/null @@ -51,11 +77,7 @@ ln -s `echo ${RELATIVE_CSHENV_LOCATION}`/vim .vim ln -s .vim/vimrc .vimrc popd >& /dev/null -if [ -e ~/.gitconfig ] -then - echo "Relocating git setup" - mv ~/.gitconfig ~/.gitconfig-old -fi +backup_config_file ~/.gitconfig echo "Installing git configuration" @@ -73,6 +95,10 @@ echo "" >> ~/.gitconfig echo "[commit]" >> ~/.gitconfig echo " gpgSign = true" >> ~/.gitconfig -echo "Do not forget to add the following lines at the top and bottom of your ssh config:" -echo "Match all\n Include ${CSHENV_LOCATION}/ssh/config" -echo "Match all\n Include ${CSHENV_LOCATION}/ssh/config" +backup_config_file ~/.ssh/config + +echo "Match all" >> ~/.ssh/config +echo " Include ${CSHENV_LOCATION}/ssh/prologue" >> ~/.ssh/config + +echo "Match all" >> ~/.ssh/config +echo " Include ${CSHENV_LOCATION}/ssh/epilogue" >> ~/.ssh/config diff --git a/startup_hooks/tcshrc b/startup_hooks/tcshrc index 58b25bd..ce532d9 100644 --- a/startup_hooks/tcshrc +++ b/startup_hooks/tcshrc @@ -1,14 +1,33 @@ # This file will always be taken in. .login is now # vestigial, and doesn't matter if first or second. -# These are the bits that would be in login: - +# Reset the CSHENV_DIR +# (TODO: Downgrade this from environment variable to shell variable) +unsetenv CSHENV_DIR if( ! $?CSHENV_DIR ) then - setenv CSHENV_DIR ~/cshenv + if( $?CSHENV_DEBUG ) then + echo "CSHENV_DIR is not set. Guessing it based upon "'${1}'": ${1}" + endif + # Done twice to strip out the hooks dir and the hook itself. + setenv CSHENV_DIR ${1}_ + setenv CSHENV_DIR `dirname ${CSHENV_DIR}` + setenv CSHENV_DIR `dirname ${CSHENV_DIR}` + if( $?CSHENV_DEBUG ) then + echo "CSHENV_DIR is auto set to ${CSHENV_DIR}" + endif + + if( "." == $#CSHENV_DIR ) then + if( $?CSHENV_DEBUG ) then + echo "CSHENV_DIR is still not set. Using guessed default." + endif + + set cshenv_fallback_dir + setenv CSHENV_DIR ~/cshenv + endif endif if( $?CSHENV_DEBUG ) then - echo "Set CSHENV_DIR to: " ${CSHENV_DIR} + echo "Set (in tcshrc hook) CSHENV_DIR to: " ${CSHENV_DIR} endif alias _debug "eval 'if ( $?CSHENV_DEBUG ) echo \!*'" @@ -27,16 +46,6 @@ set CSHENV_TCSHRC_SOURCED _debug "Starting tcshrc..." -#if( -z ${_} ) then - #echo $0 - #setenv CSHENV_TCSHRC_PATH $0 -#else - #echo ${_} - #setenv CSHENV_TCSHRC_PATH "${_}" -#endif - -#echo tcshrc hook lives at: ${CSHENV_TCSHRC_PATH} - if( -c `tty` ) then _debug "Going to source core tcshrc..." diff --git a/tcshrc.aliases b/tcshrc.aliases index bc2c5e8..fa9465f 100644 --- a/tcshrc.aliases +++ b/tcshrc.aliases @@ -1,6 +1,6 @@ # CSHENV Aliases: -alias resource source ${CSHENV_DIR}/startup_hooks/tcshrc +alias resource 'source ${CSHENV_DIR}/startup_hooks/tcshrc ${CSHENV_DIR}/startup_hooks/tcshrc' alias relog resource alias rl relog diff --git a/tcshrc.prompt.defs b/tcshrc.prompt.defs index a41d7f7..53c8280 100644 --- a/tcshrc.prompt.defs +++ b/tcshrc.prompt.defs @@ -104,6 +104,7 @@ set referencechars_raw="${referencechars_raw} 2620" set prompt_hcolor=0 set prompt_hsym=0 +_debug "Building unicode sigils table...." if( ! $?CSHENV_NO_UNICODE_PRINTF ) then set referencechars=() foreach ch ($referencechars_raw) @@ -114,6 +115,7 @@ else # Safe fallback for when there's no unicode printf set referencechars="A B C D X Y Z" endif +_debug "Done building unicode sigils table" # Rotation alias precmd 'source ${CSHENV_DIR}/tcshrc.prompt.final' diff --git a/tcshrc.prompt.final b/tcshrc.prompt.final index 7060e57..53d414d 100644 --- a/tcshrc.prompt.final +++ b/tcshrc.prompt.final @@ -139,8 +139,6 @@ if( $?CSHENV_SHOW_BATTERY_LEVEL ) then set battery_level=`pmset -g batt | grep -Eo "\d+%" | cut -d% -f1` else if( $?CSHENV_BATTERY_DEVICE ) then set battery_level=`cat ${CSHENV_BATTERY_DEVICE}` - else - set battery_level=`cat /sys/class/power_supply/BAT1/capacity` endif if( ${battery_level} < ${critical_battery_level} ) then set battery_color=${red}${blink} @@ -164,7 +162,7 @@ if( $?CSHENV_SHOW_BATTERY_LEVEL ) then #set battery_prompt="%{${battery_color}%}%{${battery_level}${at_color}\%%}%{${dim}%} " set battery_prefix="%{${csi}m${csi}28D%}" - set battery_prompt="%{${csi}38;2;128;128;255;3mBattery Level:${sgr_reset} ${battery_color}${battery_level}${percent_color_seq}%${sgr_reset} %}" + set battery_prompt="%{${csi}38;2;128;128;255;3mBattery Level:${sgr_reset} ${battery_color}${battery_level}%}${percent_color_seq}%{%${sgr_reset} %}" else set battery_prefix="" set battery_prompt="" @@ -251,7 +249,7 @@ if( ! $?CSHENV_DISABLE_PROMPT_NESTING ) then set depth_prompt_spacing=" " endif set depth_prompt_view="${depth_color_seq}${depth_prompt_spacing}${depth_prompt}" - if( $?CSHENV_HIDE_SHELL_LEVEL_AT_ONE ) then + if( ! $?CSHENV_SHOW_SHELL_LEVEL_AT_ONE ) then if( ${shlvl} == 1 ) then set depth_prompt_view="" endif @@ -294,10 +292,10 @@ endif _debug "Up to the time, date, and battery checks..." if( ! $?CSHENV_DISABLE_PROMPT_TIME ) then - set time_prompt_view="%{${time_color_seq}%}${time_prompt}%{${sgr_reset}%}" + set time_prompt_view="${time_color_seq}${time_prompt}%{${sgr_reset}%}" endif if( ! $?CSHENV_DISABLE_PROMPT_DATE ) then - set date_prompt_view="%{${date_color_seq}%}${date_prompt}%{${sgr_reset}%}" + set date_prompt_view="${date_color_seq}${date_prompt}%{${sgr_reset}%}" endif if( ! $?CSHENV_DISABLE_PROMPT_BATTERY ) then set battery_prompt_view="${battery_prefix}${battery_prompt}"