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
# 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 ))
if [ ${debug} -ne 0 ]
then
echo "Red: $red_dec"
echo "Green: $green_dec"
echo "Blue: $blue_dec"
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
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
+65 -39
View File
@@ -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
+22 -13
View File
@@ -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
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..."
+1 -1
View File
@@ -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
+2
View File
@@ -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'
+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`
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}"