Merge branch 'pre-master' into sysadmin-master

* pre-master:
  Add debug message to sigil generation.
  Make sgr builder more portable.
  Dynamic prompt colors cacheing loop
  New safe_source logic.
  All the debugging I could find.
  More debug prints converted
  Upgrade some debug printing to debug statements.
  Add `_debug` primitive
  Fix shell level hiding
  Hiding shell level at 1 is the default.
  Convert color script to portable POSIX shell
  Overhaul the installation and detection mechanisms
  No need to hardcode this anymore.

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