feat: support truecolor

- Standardize capability usage with the terminfo database for
  portability. POSIX tput does declare only the basic options such as
  'init', 'reset' and 'clear', leaving the rest unspecified, that is not
  ideal but hard coding escape sequences is way worse.
- Set colorization options based on number of colors the terminal
  supports and not the TERM variable when possible. This is incomplete,
  terminal emulators may support or adapt more than it is advertised,
  but involves using DECRQSS queries and delays, as an example, 'resize'
  utility from XTerm uses 3 seconds as delay, this is worrisome.
- Term with only '-direct' variants without ending with 256 means it
  only supports direct-color indexing, therefore 'tmux-direct' cannot be
  used, but the non-multiplexer terminal 'xterm-direct256' can.
This commit is contained in:
Ben Grande 2025-03-11 20:13:09 +01:00
parent 0bae3d94b2
commit 45a0acb222
No known key found for this signature in database
GPG Key ID: 00C64E14F51F9E56
9 changed files with 297 additions and 200 deletions

View File

@ -19,6 +19,7 @@ if ! command -v sensors >/dev/null; then
fi fi
redraw(){ redraw(){
# shellcheck disable=SC2312
stty size </dev/null 2>&1 >&2 | read -r LINES COLUMNS stty size </dev/null 2>&1 >&2 | read -r LINES COLUMNS
tput ed home tput ed home
} }
@ -44,7 +45,7 @@ get_header(){
if test "${sensors}" != "0"; then if test "${sensors}" != "0"; then
sensors | grep -E -e "^(fan[1-9]+|[C|G]PU|temp[1-9]+):" | sensors | grep -E -e "^(fan[1-9]+|[C|G]PU|temp[1-9]+):" |
grep -v -e "0 RPM" -e "+0\.0.C" | grep -v -e "0 RPM" -e "+0\.0.C" |
tr -s "\t" " " | tr "\n" "\t" | sed "s/\s\+$/\n/" tr -s "\t" " " | tr "\n" "\t" | sed "s/\s\+$/\n/" || true
fi fi
printf '%s%-40s %-6s %6s %8s%s\n' "${bold}" 'Qube' 'State' 'CPU(%)' \ printf '%s%-40s %-6s %6s %8s%s\n' "${bold}" 'Qube' 'State' 'CPU(%)' \
'MEM(MiB)' "${nobold}" 'MEM(MiB)' "${nobold}"

View File

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
## ##
## SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. <ben.grande.b@gmail.com> ## SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. <ben.grande.b@gmail.com>
## ##
## SPDX-License-Identifier: AGPL-3.0-or-later ## SPDX-License-Identifier: AGPL-3.0-or-later
## ##
@ -28,14 +28,14 @@ test -f ./setup.sh ||
if test "${qube}" = "dom0"; then if test "${qube}" = "dom0"; then
sh ./dotfiles/setup.sh sh ./dotfiles/setup.sh
user_name="$(getent group qubes | awk -F "[:,]" '{print $4}')" user="$(getent group qubes | awk -F "[:,]" '{print $4}')"
user_home="$(getent passwd "${user_name}" | awk -F ":" '{print $6}')" home="$(getent passwd "${user}" | awk -F ":" '{print $6}')"
sudo -u "${user_name}" mkdir -pv -- "${user_home}/.cache" sudo -u "${user}" mkdir -pv -- "${home}/.cache"
tmpdir="$(sudo -u "${user_name}" -- mktemp -d -- "${user_home}/.cache/XXXXXX")" tmpdir="$(sudo -u "${user}" -- mktemp -d -- "${home}/.cache/XXXXXX")"
trap 'rm -rf -- "${tmpdir}"' EXIT INT HUP QUIT ABRT trap 'rm -rf -- "${tmpdir}"' EXIT INT HUP QUIT ABRT
cp -r -- ./dotfiles "${tmpdir}" cp -r -- ./dotfiles "${tmpdir}"
chown -R -- "${user_name}:${user_name}" "${tmpdir}" chown -R -- "${user}:${user}" "${tmpdir}"
sudo -u "${user_name}" -- "${tmpdir}/dotfiles/setup.sh" sudo -u "${user}" -- "${tmpdir}/dotfiles/setup.sh"
exit exit
fi fi

View File

@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
## SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. <ben.grande.b@gmail.com> ## SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. <ben.grande.b@gmail.com>
## ##
## SPDX-License-Identifier: AGPL-3.0-or-later ## SPDX-License-Identifier: AGPL-3.0-or-later
@ -60,15 +60,17 @@ _reset_line() {
## On pending input, assume it's been echoed and we're not in first column. ## On pending input, assume it's been echoed and we're not in first column.
## Otherwise ask the terminal for current column and read it from input. ## Otherwise ask the terminal for current column and read it from input.
if read -t 0 || { if read -t 0 || {
IFS='[;' read -s -r -d'R' -p$'\033[6n' _ _ cur_y && [[ ${cur_y} != 1 ]] # shellcheck disable=SC2154
IFS='[;' read -s -r -d'R' -p "${_t_u7}" _ _ cur_y && [[ ${cur_y} != 1 ]]
} }
then then
unset cur_y unset cur_y
## Print line ending char with reversed video and end with newline. ## Print line ending char with reversed video and end with newline.
if test "${color_prompt-}" = "yes"; then if test "${color_prompt-}" = "yes"; then
printf '%b' "\033[41m\033[0m\033[7m%\033[0m\n\r" # shellcheck disable=SC2154
printf '%s\n\r' "${_t_sgr0}${_t_rev}%${_t_sgr0}"
else else
printf '%b' "%\n\r" printf '%s\n\r' "%"
fi fi
fi fi
} }
@ -76,9 +78,11 @@ _reset_line() {
_print_ec(){ _print_ec(){
test "${_ec_ps1}" = "0" && return test "${_ec_ps1}" = "0" && return
if test "${color_prompt:-}" = "yes"; then if test "${color_prompt:-}" = "yes"; then
printf '%b%s%b' "(\001\033[31m\002" "${_ec_ps1}" "\001\033[0m\002)" # shellcheck disable=SC2154
printf '(\001%s\002%s\001%s\002)' "${_t_setaf_1}" "${_ec_ps1}" \
"${_t_sgr0}"
else else
printf '%s' "(${_ec_ps1})" printf '(%s)' "${_ec_ps1}"
fi fi
unset _ec_ps1 unset _ec_ps1
} }
@ -90,10 +94,10 @@ newline=$'\n'
# shellcheck disable=SC2154 # shellcheck disable=SC2154
if test "${color_prompt:-}" = "yes"; then if test "${color_prompt:-}" = "yes"; then
# shellcheck disable=SC2154 # shellcheck disable=SC2154
PS1="\$(_reset_line)\$(resize-terminal)\[\033[35m\][\[${reset_color}\]" PS1="\$(_reset_line)\$(resize-terminal)\[${_t_setaf_5}\][\[${_t_sgr0}\]"
PS1="${PS1}${debian_chroot:+(${debian_chroot})}\[${usercolor}\]\u@\h " PS1="${PS1}${debian_chroot:+(${debian_chroot})}\[${usercolor}\]\u@\h "
PS1="${PS1}\[${dircolor}\]\w\[${reset_color}\]\$(_git_prompt_info)" PS1="${PS1}\[${dircolor}\]\w\[${_t_sgr0}\]\$(_git_prompt_info)"
PS1="${PS1}\[\033[35m\]]\[${reset_color}\]${newline-}\$(_print_ec)" PS1="${PS1}\[${_t_setaf_5}\]]\[${_t_sgr0}\]${newline-}\$(_print_ec)"
PS1="${PS1}${ps1_symbol} " PS1="${PS1}${ps1_symbol} "
else else
PS1="\$(_reset_line)\$(resize-terminal)" PS1="\$(_reset_line)\$(resize-terminal)"

View File

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
## SPDX-FileCopyrightText: 2004 - 2022 Tim Pope <https://tpo.pe> ## SPDX-FileCopyrightText: 2004 - 2022 Tim Pope <https://tpo.pe>
## SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. <ben.grande.b@gmail.com> ## SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. <ben.grande.b@gmail.com>
## ##
## SPDX-License-Identifier: AGPL-3.0-or-later ## SPDX-License-Identifier: AGPL-3.0-or-later
@ -157,27 +157,196 @@ fi
## }}} ## }}}
## }}} ## }}}
## {{{ Prompt ## {{{ Prompt
## Set ability to color terminal. # shellcheck disable=SC2034
# shellcheck disable=2034 _get_term_cap(){
case "${TERM-}" in ## SGR
iterm|*-truecolor) _t_colors="$(tput colors)" 2>/dev/null || true
export COLORTERM=truecolor; color_prompt=yes _t_sgr0="$(tput sgr0)" 2>/dev/null || true
;; _t_bold="$(tput bold)" 2>/dev/null || true
*-color|*-256color|linux*|vt100*|vt220*) _t_dim="$(tput dim)" 2>/dev/null || true
color_prompt=yes _t_sitm="$(tput sitm)" 2>/dev/null || true
;; _t_smul="$(tput smul)" 2>/dev/null || true
""|dumb) _t_blink="$(tput blink)" 2>/dev/null || true
color_prompt=no _t_rev="$(tput rev)" 2>/dev/null || true
;; _t_smso="$(tput rmso)" 2>/dev/null || true
*) _t_invis="$(tput invis)" 2>/dev/null || true
color_prompt=no _t_ritm="$(tput ritm)" 2>/dev/null || true
;; _t_rmul="$(tput rmul)" 2>/dev/null || true
esac _t_rmso="$(tput rmso)" 2>/dev/null || true
if test -n "${NO_COLOR-}"; then _t_setaf_0="$(tput setaf 0)" 2>/dev/null || true
color_prompt=no _t_setaf_1="$(tput setaf 1)" 2>/dev/null || true
fi _t_setaf_2="$(tput setaf 2)" 2>/dev/null || true
_t_setaf_3="$(tput setaf 3)" 2>/dev/null || true
_t_setaf_4="$(tput setaf 4)" 2>/dev/null || true
_t_setaf_5="$(tput setaf 5)" 2>/dev/null || true
_t_setaf_6="$(tput setaf 6)" 2>/dev/null || true
_t_setaf_7="$(tput setaf 7)" 2>/dev/null || true
_t_setab_0="$(tput setab 0)" 2>/dev/null || true
_t_setab_1="$(tput setab 1)" 2>/dev/null || true
_t_setab_2="$(tput setab 2)" 2>/dev/null || true
_t_setab_3="$(tput setab 3)" 2>/dev/null || true
_t_setab_4="$(tput setab 4)" 2>/dev/null || true
_t_setab_5="$(tput setab 5)" 2>/dev/null || true
_t_setab_6="$(tput setab 6)" 2>/dev/null || true
_t_setab_7="$(tput setab 7)" 2>/dev/null || true
## Movement
_t_ed="$(tput ed)" 2>/dev/null || true
_t_el="$(tput el)" 2>/dev/null || true
_t_home="$(tput home)" 2>/dev/null || true
_t_cnorm="$(tput cnorm)" 2>/dev/null || true
_t_civis="$(tput civis)" 2>/dev/null || true
_t_smcup="$(tput smcup)" 2>/dev/null || true
_t_rmcup="$(tput rmcup)" 2>/dev/null || true
_t_sc="$(tput sc)" 2>/dev/null || true
_t_clear="$(tput clear)" 2>/dev/null || true
## Extra
_t_cub1="$(tput cub1)" 2>/dev/null || true
_t_cud1="$(tput cud1)" 2>/dev/null || true
_t_ind="$(tput ind)" 2>/dev/null || true
_t_cr="$(tput cr)" 2>/dev/null || true
_t_u7="$(tput u7)" 2>/dev/null || true
_t_u8="$(tput u8)" 2>/dev/null || true
_t_u9="$(tput u9)" 2>/dev/null || true
}
_get_color_support(){
if test -n "${NO_COLOR-}"; then
color_support=-1
return 0
fi
case "${COLORTERM-}" in
truecolor|24bit)
color_support=$((1 << 24))
return 0
;;
*) ;;
esac
if has tput; then
if tput RGB >/dev/null 2>&1; then
color_support=$((1 << 24))
return 0
fi
color_support=${_t_colors}
if test -n "${color_support}"; then
return 0
fi
fi
## Color query from terminfo is relatively new, only available in ncurses
## since 2018. Below is a match based on terminfo revision 1.909 to query
## number of supported colors in case the terminfo database can't be
## queried.
case "${TERM-}" in
*?-truecolor*|*?-direct*)
## TODO: Some terminals such as iTerm should be in this list.
color_support=$((1 << 24))
;;
*?-256color*|absolute|alacritty|Apple_Terminal|domterm|iterm|iterm2|\
iTerm2.app|iTerm.app|kitty|mintty|ms-terminal|nsterm|nsterm-build309|\
nsterm-build326|nsterm-build343|nsterm-build361|nsterm-build400|\
nsterm-build440|scrt|securecrt|terminator|terminology|terminology-0.6.1|\
terminology-1.0.0|terminology-1.8.1|termite|vscode|xterm+256setaf|\
xterm.js)
color_support=256
;;
*?-88color*|rxvt-unicode)
color_support=88
;;
hpterm-color|wy370|wy370-101k|wy370-105k|wy370-EPC|wy370-nk|wy370-rv|\
wy370-vb|wy370-w|wy370-wvb|wyse370)
color_support=64
;;
d430c-dg-ccc|d430c-unix-25-ccc|d430c-unix-ccc|d430c-unix-s-ccc|\
d430c-unix-sr-ccc|d430c-unix-w-ccc|d430-dg-ccc|d430-unix-25-ccc|\
d430-unix-ccc|d430-unix-s-ccc|d430-unix-sr-ccc|d430-unix-w-ccc|dg+ccc|\
dgunix+ccc)
color_support=52
;;
*?-16color*|amiga-vnc|atari-color|atari_st-color|at-color|d430c-dg|\
d430c-unix|d430c-unix-25|d430c-unix-s|d430c-unix-sr|d430c-unix-w|d430-dg|\
d430-unix|d430-unix-25|d430-unix-s|d430-unix-sr|d430-unix-w|d470|d470-7b|\
d470c|d470c-7b|d470c-dg|d470-dg|dg+color|dg+fixed|dgmode+color|\
dgunix+fixed|hp2397|hp2397a|hp+color|ncr260wy325pp|ncr260wy325wpp|\
ncr260wy350pp|ncr260wy350wpp|nsterm-7-c|nsterm-7-c-s|nsterm-acs-c|\
nsterm-acs-c-s|nsterm-bce|nsterm+c|nsterm-c|nsterm-c-7|nsterm-c-acs|\
nsterm-c-s|nsterm-c-s-7|nsterm-c-s-acs|st52-color|tt52|tw52|\
tw52-color)
color_support=16
;;
*?-color*|color_xterm|386at|aixterm|alacritty+common|ansi|ansi80x25|\
ansi80x25-raw|ansi80x30|ansi80x43|ansi80x50|ansi80x60|ansi-emx|ansil|\
ansis|ansi.sys|ansi.sysk|ansisysk|ansi.sys-old|ansiw|arm100|arm100-am|\
arm100-w|arm100-wam|at386|aterm|att6386|beterm|bsdos-pc|bsdos-pc-nobold|\
bsdos-ppc|bterm|cons25|cons25-debian|cons25-iso8859|cons25-koi8-r|\
cons25l1|cons25r|cons25w|cons30|cons43|cons50|cons50-iso8859|\
cons50-koi8r|cons50l1|cons50r|cons60|cons60-iso|cons60-koi8r|cons60l1|\
cons60r|crt|crt-vt220|ctrm|cx|cx100|cygwin|cygwinB19|cygwinDBG|d220|\
d220-7b|d220-dg|d230|d230c|d230c-dg|d230-dg|darwin|darwin-100x37|\
darwin-112x37|darwin-128x40|darwin-128x48|darwin-144x48|darwin-160x64|\
darwin-200x64|darwin-200x75|darwin-256x96|darwin-80x25|darwin-80x30|\
darwin-90x30|darwin-b|darwin-f|darwin-f2|decansi|djgpp|djgpp204|dtterm|\
dumb-emacs-ansi|dvtm|emots|emx-base|Eterm|gnome|gnome-2007|gnome-2008|\
gnome-2012|gnome-fc5|gnome-rh62|gnome-rh72|gnome-rh80|gnome-rh90|gs6300|\
hft|hft-c|hft-c-old|hft-old|hterm|hurd|i3164|ibm3164|ibm5081|ibm5154|\
ibm6154|ibm8503|ibm8507|ibm8512|ibm8513|ibm8514|ibm8604|ibmpc3|ibmpc3r|\
interix|interix-nti|jaixterm|jfbterm|kon|kon2|konsole|konsole-base|\
konsole-linux|konsole-solaris|konsole-vt100|konsole-vt420pc|konsole-xf3x|\
konsole-xf4x|kterm|kterm-co|kvt|linux|linux2.2|linux2.6|linux2.6.26|\
linux3.0|linux-basic|linux-c|linux-c-nc|linux-koi8|linux-koi8r|linux-lat|\
linux-m1|linux-nic|linux-s|linux-vt|mgt|mgterm|minitel1|minitel1b|minix|\
minix-3.0|mintty+common|mlterm|mlterm2|mlterm3|mosh|mrxvt|ms-vt100+|\
ms-vt-utf8|mvterm|nansi.sys|nansisys|nansi.sysk|nansisysk|ncr260intan|\
ncr260intpp|ncr260intwan|ncr260intwpp|ncsa|ncsa-ns|ncsa-vt220|netbsd6|\
nsterm-7|nsterm-7-s|nsterm-acs|nsterm-acs-s|nsterm+c41|nsterm-old|\
nsterm-s|nsterm-s-7|nsterm-s-acs|ntconsole|ntconsole-100|\
ntconsole-100-nti|ntconsole-25|ntconsole-25-nti|ntconsole-25-w|\
ntconsole-25-w-vt|ntconsole-35|ntconsole-35-nti|ntconsole-35-w|\
ntconsole-50|ntconsole-50-nti|ntconsole-50-w|ntconsole-60|\
ntconsole-60-nti|ntconsole-60-w|ntconsole-w|ntconsole-w-vt|nxterm|old-st|\
opennt|opennt-100|opennt-100-nti|opennt-25|opennt-25-nti|opennt-25-w|\
opennt-25-w-vt|opennt-35|opennt-35-nti|opennt-35-w|opennt-50|\
opennt-50-nti|opennt-50-w|opennt-60|opennt-60-nti|opennt-60-w|opennt-nti|\
opennt-w|opennt-w-vt|pc3|pc3-bold|pc3r|pcansi|pcansi-25|pcansi25|\
pcansi-33|pcansi33|pcansi-43|pcansi43|pccon|pccon0|pc-minix|putty|\
putty-m1|putty-noapp|putty-sco|putty-screen|putty-vt100|qansi|qansi-g|\
qansi-m|qansi-t|qansi-w|qnx|qnx4|qnxm|qnxt|qnxt2|qnxt4|qnxw|rxvt|\
rxvt-cygwin|rxvt-cygwin-native|rxvt-xpm|scoansi|scoansi-new|scoansi-old|\
screen|screen4|screen5|screen-base|screen-bce|screen-bce.Eterm|\
screen-bce.gnome|screen-bce.konsole|screen-bce.linux|screen-bce.mrxvt|\
screen-bce.rxvt|screen-bce.xterm-new|screen.Eterm|screen.gnome|\
screen.konsole|screen.linux|screen.linux-m1|screen.linux-s|\
screen.minitel1|screen.minitel1b|screen.mlterm|screen.mrxvt|screen.putty|\
screen.putty-m1|screen.rxvt|screen-s|screen.teraterm|screen.vte|screen-w|\
screen.xterm-new|screen.xterm-xfree86|simpleterm|st|st-0.6|st-0.7|st-0.8|\
stterm|tek4205|teken|teken-2018|teken-2022|teken-sc|teken-vt|teraterm|\
teraterm2.3|teraterm4.59|teraterm4.97|ti928|ti928-8|ti_ansi|tmux|tw100|\
uwin|vt100+|vte|vte-2007|vte-2008|vte-2012|vte-2014|vte-2017|vte-2018|\
vtnt|vt-utf8|vv100|vwmterm|wsvt25|wsvt25m|wy350|wy350-vb|wy350-w|\
wy350-wvb|wyse350|wyse350-vb|wyse350-w|wyse350-wvb|xfce|xiterm|xnuppc|\
xnuppc-100x37|xnuppc-112x37|xnuppc-128x40|xnuppc-128x48|xnuppc-144x48|\
xnuppc-160x64|xnuppc-200x64|xnuppc-200x75|xnuppc-256x96|xnuppc-80x25|\
xnuppc-80x30|xnuppc-90x30|xnuppc-b|xnuppc+c|xnuppc-f|xnuppc-f2|xterm|\
xterm1|xterm-1002|xterm-1003|xterm-1005|xterm-1006|xterm-8bit|\
xterm-basic|xtermc|xterm-debian|xterm-hp|xterm-new|xterm-nic|xterm-noapp|\
xterm+nofkeys|xterm-p370|xterm-p371|xterm-sco|xterms-sun|xterm-sun|\
xterm-utf8|xterm-vt220|xterm-x10mouse|xterm-x11hilite|xterm-x11mouse|\
xterm-xf86-v32|xterm-xf86-v33|xterm-xf86-v333|xterm-xf86-v40|\
xterm-xf86-v43|xterm-xf86-v44|xterm-xfree86|xterm-xi|xwsh)
color_support=8
;;
*)
color_support=-1
;;
esac
}
_get_term_cap
_get_color_support
case "${color_support}" in
$((1 << 24))) export COLORTERM=truecolor; color_prompt=yes;;
[1-9]*) color_prompt=yes;;
*) color_prompt=no;;
esac
## Colorise "ls" output.
if test "${color_prompt-}" = "yes"; then if test "${color_prompt-}" = "yes"; then
if has dircolors; then if has dircolors; then
## Use dircolors if available. ## Use dircolors if available.
@ -192,7 +361,8 @@ if test "${color_prompt-}" = "yes"; then
## Fix bold on some terminals. ## Fix bold on some terminals.
case "${TERM-}" in case "${TERM-}" in
xterm*|screen*) xterm*|screen*)
LS_COLORS="$(printf '%s\n' "${LS_COLORS}" | sed -e 's/01;3/00;9/g')" LS_COLORS="$(printf '%s' "${LS_COLORS}" |
sed -e 's/01;3\([0-9]\)/00;9\1/g')"
;; ;;
*) ;; *) ;;
esac esac
@ -203,22 +373,21 @@ if test "${color_prompt-}" = "yes"; then
export CLICOLOR CLICOLOR_FORCE LSCOLORS export CLICOLOR CLICOLOR_FORCE LSCOLORS
fi fi
## Set gcc colors.
GCC_COLORS="error=00;31:warning=01;35:note=01;36:caret=01;32:locus=01" GCC_COLORS="error=00;31:warning=01;35:note=01;36:caret=01;32:locus=01"
GCC_COLORS="${GCC_COLORS}:quote=01" GCC_COLORS="${GCC_COLORS}:quote=01"
export GCC_COLORS export GCC_COLORS
## Colors for programs that uses less such as 'man'. ## Colors for programs that uses 'less' such as 'man'.
GROFF_NO_SGR=1 GROFF_NO_SGR=1
LESS_TERMCAP_mb="$(tput bold; tput setaf 2)" # begin blink LESS_TERMCAP_mb="${_t_bold}${_t_setaf_2}"
LESS_TERMCAP_md="$(tput bold; tput setaf 6)" # begin bold LESS_TERMCAP_md="${_t_bold}${_t_setaf_6}"
LESS_TERMCAP_me="$(tput sgr0)" # reset bold/blink LESS_TERMCAP_me="${_t_sgr0}"
LESS_TERMCAP_so="$(tput bold; tput setaf 7; tput setab 4)" # begin rev video LESS_TERMCAP_so="${_t_bold}${_t_setaf_7}${_t_setab_4}"
LESS_TERMCAP_se="$(tput rmso; tput sgr0)" # reset rev video LESS_TERMCAP_se="${_t_rmso}${_t_sgr0}"
LESS_TERMCAP_us="$(tput smul; tput bold; tput setaf 2)" # begin underline LESS_TERMCAP_us="${_t_smul}${_t_bold}${_t_setaf_2}"
LESS_TERMCAP_ue="$(tput rmul; tput sgr0)" # reset underline LESS_TERMCAP_ue="${_t_rmul}${_t_sgr0}"
LESS_TERMCAP_mr="$(tput rev)" # revert LESS_TERMCAP_mr="${_t_rev}"
LESS_TERMCAP_mh="$(tput dim)" # dimerize LESS_TERMCAP_mh="${_t_dim}"
export GROFF_NO_SGR export GROFF_NO_SGR
export LESS_TERMCAP_mb LESS_TERMCAP_md LESS_TERMCAP_me export LESS_TERMCAP_mb LESS_TERMCAP_md LESS_TERMCAP_me
export LESS_TERMCAP_so LESS_TERMCAP_se LESS_TERMCAP_us export LESS_TERMCAP_so LESS_TERMCAP_se LESS_TERMCAP_us
@ -246,46 +415,46 @@ _git_prompt_info(){
ref="$(git describe --tags --exact-match HEAD 2>/dev/null)" ref="$(git describe --tags --exact-match HEAD 2>/dev/null)"
test "${ref-}" || ref="$(git rev-parse HEAD 2>/dev/null | cut -c 1-7)" test "${ref-}" || ref="$(git rev-parse HEAD 2>/dev/null | cut -c 1-7)"
test "${ref-}" || return test "${ref-}" || return
# shellcheck disable=2039,3003 case "${color_support-}" in
case "${TERM-}" in 256|$((1 << 24))) branchcolor="$(printf '%b' "\033[38;5;31m")";;
*-256color|xterm-kitty) branchcolor=$'\033[38;5;31m' ;; 88) branchcolor="$(printf '%b' "\033[38;5;22m")";;
*-88color|rxvt-unicode) branchcolor=$'\033[38;5;22m' ;; [1-9]*) branchcolor="${_t_bold}${_t_setaf_4}";;
*) branchcolor=$'\033[0;94m' ;; *) branchcolor="";;
esac esac
if test -n "${ZSH_VERSION-}"; then if test -n "${ZSH_VERSION-}"; then
# shellcheck disable=2016 # shellcheck disable=2016
if test "${color_prompt-}" = "yes"; then if test "${color_prompt-}" = "yes"; then
print -Pn '(%%{${branchcolor}%%}%20>...>${ref}%<<%%{\033[0m%%})' print -Pn '(%%{${branchcolor}%%}%20>...>${ref}%<<%%{${_t_sgr0}%%})'
else else
print -Pn '(%20>...>${ref}%<<)' print -Pn '(%20>...>${ref}%<<)'
fi fi
else else
if test "${color_prompt-}" = "yes"; then if test "${color_prompt-}" = "yes"; then
printf '%s' "(${branchcolor}${ref}${reset_color})" printf '%s' "(${branchcolor}${ref}${_t_sgr0})"
else else
printf '%s' "(${ref})" printf '%s' "(${ref})"
fi fi
fi fi
unset ref unset ref branchcolor
} }
# shellcheck disable=SC2034 # shellcheck disable=SC2034
reset_color="$(printf '%b' '\033[0m')" case "${color_support-}" in
256|$((1 << 24)))
# shellcheck disable=SC2034
## Use echotc Co? Only available by default for zsh, not bash.
case "${TERM-}" in
*-256color|xterm-kitty)
usercolor="$(printf '%b' "\033[38;5;184m")" usercolor="$(printf '%b' "\033[38;5;184m")"
dircolor="$(printf '%b' "\033[38;5;27m")" dircolor="$(printf '%b' "\033[38;5;27m")"
;; ;;
*-88color|rxvt-unicode) 88)
usercolor="$(printf '%b' "\033[38;5;56m")" usercolor="$(printf '%b' "\033[38;5;56m")"
dircolor="$(printf '%b' "\033[38;5;23m")" dircolor="$(printf '%b' "\033[38;5;23m")"
;; ;;
[1-9]*)
usercolor="${_t_bold}${_t_setaf_3}"
dircolor="${_t_bold}${_t_setaf_4}"
;;
*) *)
usercolor="$(printf '%b' "\033[0;93m")" usercolor=""
dircolor="$(printf '%b' "\033[1;34m")" dircolor=""
;; ;;
esac esac
@ -297,16 +466,14 @@ esac
# shellcheck disable=SC2034 # shellcheck disable=SC2034
uid="$(id -u)" uid="$(id -u)"
if test "${uid}" = "0"; then if test "${uid}" = "0"; then
usercolor="$(printf '%b' "\033[0;97m")" usercolor="${_t_bold}${_t_setaf_7}"
ps1_symbol="#" ps1_symbol="#"
fi fi
unset uid unset uid
## Do not colorize this prompt, Sh fails to count the correct number of
## characters on the prompt leading to problems.
user="$(id -un)" user="$(id -un)"
if test "${color_prompt-}" = "yes"; then if test "${color_prompt-}" = "yes"; then
PS1="[${usercolor}${user} $(hostname -s)${reset_color}]${ps1_symbol} " PS1="[${usercolor}${user} $(hostname -s)${_t_sgr0}]${ps1_symbol} "
else else
PS1="${user}@$(hostname -s)${ps1_symbol} " PS1="${user}@$(hostname -s)${ps1_symbol} "
fi fi

View File

@ -1,7 +1,7 @@
#!/usr/bin/env zsh #!/usr/bin/env zsh
## SPDX-FileCopyrightText: 2004 - 2022 Tim Pope <https://tpo.pe> ## SPDX-FileCopyrightText: 2004 - 2022 Tim Pope <https://tpo.pe>
## SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. <ben.grande.b@gmail.com> ## SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. <ben.grande.b@gmail.com>
## ##
## SPDX-License-Identifier: AGPL-3.0-or-later ## SPDX-License-Identifier: AGPL-3.0-or-later
@ -20,6 +20,7 @@ source "$HOME/.zprofile"
source "$ENV" source "$ENV"
## }}} ## }}}
## {{{ Options ## {{{ Options
PROMPT_EOL_MARK='%b%B%S%#%s%b'
## - Quiet ## - Quiet
setopt no_beep setopt no_beep
## - Words ## - Words
@ -74,10 +75,10 @@ if test "${color_prompt-}" = "yes"; then
[[ "${COLORTERM-}" == (24bit|truecolor) || [[ "${COLORTERM-}" == (24bit|truecolor) ||
"${terminfo[colors]}" -eq '16777216' ]] || zmodload zsh/nearcolor "${terminfo[colors]}" -eq '16777216' ]] || zmodload zsh/nearcolor
PS1="\$(resize-terminal)%F{magenta}[%{$usercolor%}%n@%m%F{reset_color%}" PS1="\$(resize-terminal)%F{magenta}[%{${usercolor}%}%n@%m%F{reset_color%}"
PS1="${PS1} %{$dircolor%}%50<...<%~%<<%F{reset_color%}\$(_git_prompt_info)" PS1="${PS1} %{$dircolor%}%50<...<%~%<<%F{reset_color%}\$(_git_prompt_info)"
PS1="${PS1}%F{magenta}]%F{reset_color}${newline-}${ps1_symbol} " PS1="${PS1}%F{magenta}]%F{reset_color}${newline-}${ps1_symbol} "
RPS1="%(?..(%{"$'\033[31m'"%}%?%{$reset_color%}%)%<<)" RPS1="%(?..(%F{red%}%?%F{reset_color%}%)%<<)"
else else
PS1="\$(resize-terminal)[%n@%M %~\$(_git_prompt_info)]${newline}" PS1="\$(resize-terminal)[%n@%M %~\$(_git_prompt_info)]${newline}"
PS1="${PS1}${ps1_symbol} " PS1="${PS1}${ps1_symbol} "
@ -103,7 +104,6 @@ case "${TERM-}" in
precmd() { precmd() {
_set_title "$@" _set_title "$@"
if [ "${STY:-}" -o "${TMUX:-}" ]; then if [ "${STY:-}" -o "${TMUX:-}" ]; then
print -Pn '\033]1;\a\033]1;@%m\a'
print -Pn '\033k@\033\\' print -Pn '\033k@\033\\'
else else
print -Pn '\033k@%m\033\\' print -Pn '\033k@%m\033\\'
@ -111,17 +111,17 @@ case "${TERM-}" in
} }
preexec() { preexec() {
_set_title "$@" _set_title "$@"
print -n "\033k" return 0
print -Pnr '%10>..>$1' | tr '\0-\037' '?' #print -Pnr '%10>..>$1' | tr '\0-\037' '?'
if [ "${STY:-}" -o "${TMUX:-}" ]; then #if [ "${STY:-}" -o "${TMUX:-}" ]; then
print -Pn '@\033\\' # print -Pn '\033k@\033\\'
else #else
print -Pn '@%m\033\\' # print -Pn '\033k@%m\033\\'
fi #fi
} }
;; ;;
xterm*|rxvt*|Eterm*|kterm*|putty*|dtterm*|ansi*|cygwin*) *?-direct*|xterm*|rxvt*|Eterm*|kterm*|putty*|dtterm*|ansi*|cygwin*)
precmd () { _set_title "$@" } precmd () { _set_title "$@" }
preexec() { _set_title "$@" } preexec() { _set_title "$@" }
;; ;;
@ -134,8 +134,8 @@ case "${TERM-}" in
;; ;;
esac esac
unset hostcolor hostletter hostcode dircolor usercolor usercode reset_color \ unset hostcolor hostletter hostcode dircolor usercolor usercode newline \
newline ps1_symbol ps1_symbol
## }}} ## }}}
## {{{ Completions ## {{{ Completions
@ -224,9 +224,10 @@ if test "${color_prompt-}" = "yes"; then
## Enable auto-suggestions based on the history ## Enable auto-suggestions based on the history
if test -f /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh; then if test -f /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh; then
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=30 ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=30
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=7,bg=8,underline" ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="standout"
typeset -a ZSH_AUTOSUGGEST_CLEAR_WIDGETS typeset -a ZSH_AUTOSUGGEST_CLEAR_WIDGETS
ZSH_AUTOSUGGEST_CLEAR_WIDGETS+=(bracketed-paste) ZSH_AUTOSUGGEST_STRATEGY=(history completion)
ZSH_AUTOSUGGEST_CLEAR_WIDGETS+=(bracketed-paste accept-line)
source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh
fi fi
## Highlight commands as you type ## Highlight commands as you type
@ -236,7 +237,6 @@ if test "${color_prompt-}" = "yes"; then
ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern regexp) ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern regexp)
typeset -A ZSH_HIGHLIGHT_STYLES typeset -A ZSH_HIGHLIGHT_STYLES
ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=red' ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=red'
ZSH_HIGHLIGHT_STYLES[default]='fg=white'
ZSH_HIGHLIGHT_STYLES[alias]='fg=cyan' ZSH_HIGHLIGHT_STYLES[alias]='fg=cyan'
ZSH_HIGHLIGHT_STYLES[function]='fg=cyan' ZSH_HIGHLIGHT_STYLES[function]='fg=cyan'
ZSH_HIGHLIGHT_STYLES[builtin]='fg=green' ZSH_HIGHLIGHT_STYLES[builtin]='fg=green'

View File

@ -14,8 +14,10 @@ if test -n "${TERM_RESIZE_DISABLE:-}"; then
fi fi
test -t 0 || exit 0 test -t 0 || exit 0
case "${TERM-}" in
msg_unsupported="error: cannot resize screen: unsupported terminal emulator" dumb) exit 0;;
*);;
esac
## If argument is provided, allow user to bypass tty check. ## If argument is provided, allow user to bypass tty check.
if test "${#}" -eq 0; then if test "${#}" -eq 0; then
@ -46,15 +48,17 @@ if test "${#}" -eq 0; then
unset term_file_active unset term_file_active
fi fi
sc="$(tput sc || printf '%b' '\0337')" get_caps(){
rc="$(tput rc || printf '%b' '\0338')" sc="$(tput sc || printf '%b' '\0337')"
cup="$(tput cup 99999 99999 || printf '%b' '\033[99999;99999H')" rc="$(tput rc || printf '%b' '\0338')"
csr="$(tput csr || printf '%b' '\033[r')" cup="$(tput cup 99999 99999 || printf '%b' '\033[99999;99999H')"
gc="$(tput u7 || printf '%b' '\033[6n')" csr="$(tput csr || printf '%b' '\033[r')"
gc="$(tput u7 || printf '%b' '\033[6n')"
}
## POSIX compliant. ## POSIX compliant.
# shellcheck disable=SC3045 # shellcheck disable=SC3045
if ! printf '%s\n' "R" | read -r -t 1 -sd R 2>/dev/null; then if ! (printf '%s\n' "R" | read -r -t 1 -sd R 2>/dev/null); then
## Fast but depends on XTerm. ## Fast but depends on XTerm.
if has resize; then if has resize; then
resize_cmd="$(resize)" resize_cmd="$(resize)"
@ -62,6 +66,7 @@ if ! printf '%s\n' "R" | read -r -t 1 -sd R 2>/dev/null; then
exit 0 exit 0
fi fi
## Slow due to heavy stty calls. ## Slow due to heavy stty calls.
get_caps
termios="$(stty -g)" termios="$(stty -g)"
stty raw -echo min 0 time 1 stty raw -echo min 0 time 1
printf '%s' "${sc}${csr}${cup}${gc}${rc}" >/dev/tty printf '%s' "${sc}${csr}${cup}${gc}${rc}" >/dev/tty
@ -71,7 +76,9 @@ if ! printf '%s\n' "R" | read -r -t 1 -sd R 2>/dev/null; then
exit 0 exit 0
fi fi
msg_unsupported="error: cannot resize screen: unsupported terminal emulator"
## Non-POSIX compliant and fast. ## Non-POSIX compliant and fast.
get_caps
stty -echo stty -echo
printf '%s' "${sc}${csr}${cup}${gc}${rc}" >/dev/tty printf '%s' "${sc}${csr}${cup}${gc}${rc}" >/dev/tty
# shellcheck disable=3045,SC2034 # shellcheck disable=3045,SC2034

View File

@ -1,6 +1,6 @@
## tmux.conf ## tmux.conf
## SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. <ben.grande.b@gmail.com> ## SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. <ben.grande.b@gmail.com>
## ##
## SPDX-License-Identifier: AGPL-3.0-or-later ## SPDX-License-Identifier: AGPL-3.0-or-later
@ -17,7 +17,13 @@ set-option -g history-limit 10000
set-option -g repeat-time 2000 set-option -g repeat-time 2000
set-option -g escape-time 50 set-option -g escape-time 50
set-option -g status-position top set-option -g status-position top
set-option -g default-terminal tmux-256color run-shell '\
colors=$(tput colors) || true 2>/dev/null; \
if test "$colors" -lt 256; then \
tmux set-option -g default-terminal tmux; \
elif test "$colors" -ge 256; then \
tmux set-option -g default-terminal tmux-256color; \
fi'
set-option -g display-panes-time 2000 set-option -g display-panes-time 2000
set-option -g display-time 2000 set-option -g display-time 2000
set-option -g focus-events on set-option -g focus-events on

View File

@ -1,5 +1,5 @@
" SPDX-FileCopyrightText: 2004 - 2022 Tim Pope <https://tpo.pe> " SPDX-FileCopyrightText: 2004 - 2022 Tim Pope <https://tpo.pe>
" SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. <ben.grande.b@gmail.com> " SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. <ben.grande.b@gmail.com>
" "
" SPDX-License-Identifier: Vim " SPDX-License-Identifier: Vim
" "
@ -556,6 +556,9 @@ if (&t_Co > 2 || has('gui_running')) && has('syntax')
endif endif
if has('vim_starting') if has('vim_starting')
set list set list
if has('termguicolors') && &t_Co > 256
setglobal termguicolors
endif
if !exists('g:colors_name') if !exists('g:colors_name')
colorscheme vividchalk colorscheme vividchalk
endif endif

View File

@ -1,15 +1,14 @@
! ~/.Xresources ! ~/.Xresources
! vim:set foldmethod=expr foldexpr=getline(v\:lnum)=~'^!##'?'>1'\:'=':
! SPDX-FileCopyrightText: 2004 - 2016 Tim Pope <https://tpo.pe> ! SPDX-FileCopyrightText: 2004 - 2016 Tim Pope <https://tpo.pe>
! SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. <ben.grande.b@gmail.com> ! SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. <ben.grande.b@gmail.com>
! !
! SPDX-License-Identifier: AGPL-3.0-or-later ! SPDX-License-Identifier: AGPL-3.0-or-later
!
! Credits: https://github.com/tpope/dotfiles/blob/master/.Xresources ! Credits: https://github.com/tpope/dotfiles/blob/master/.Xresources
! vim:set foldmethod=expr foldexpr=getline(v\:lnum)=~'^!##'?'>1'\:'=':
*international: true *international: true
*customization: -color *customization: -color
!## TERMINAL COMMON !## TERMINAL COMMON
#ifndef FIXED #ifndef FIXED
@ -24,100 +23,6 @@
#endif #endif
#endif #endif
! http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html
! https://en.wikipedia.org/wiki/X11_color_names
! https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg
! RGB to HEX https://unix.stackexchange.com/a/269085
! https://misc.flogisoft.com/bash/tip_colors_and_formatting
! https://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux
! https://unix.stackexchange.com/questions/124407/what-color-codes-can-i-use-in-my-bash-ps1-prompt
! name dark light
! black 0 8
! red 1 9
! green 2 10
! yellow 3 11
! blue 4 12
! purple 5 13
! cyan 6 14
! white 7 15
! Tpope colors
*color0: #000000
*color1: #aa0000
*color2: #00aa00
*color3: #aa5522
*color4: #0000ee
*color5: #aa00aa
*color6: #00aaaa
*color7: #aaaaaa
*color8: #555555
*color9: #ff4444
*color10: #44ff44
*color11: #ffff00
*color12: #5c5cff
*color13: #ff00ff
*color14: #00ffff
*color15: #ffffff
*colorBD: #ffffff
! *.cursorColor: #ffffff
! *color0: #000000
! *color1: #aa0000
! *color2: #00aa00
! *color3: #aa5522
! *color4: #0000ee
! *color5: #aa00aa
! *color6: #00aaaa
! *color7: #aaaaaa
! *color8: #555555
! *color9: #ff4444
! *color10: #44ff44
! *color11: #ffff00
! *color12: #5c5cff
! *color13: #ff00ff
! *color14: #00ffff
! *color15: #ffffff
! *colorBD: #ffffff
! ! Black / Grey
! *.color0: #000000
! ! *.color8: #808080
! *.color8: #767676
! ! Red / Bright Red
! *.color1: #800000
! *.color9: #FF0000
! ! Green + Bright Green
! ! *.color2: #008000
! *.color2: #00af00
! *.color10: #00ff00
! ! Yellow (Orange) + Bright Yellow (Yellow)
! *.color3: #808000
! *.color11: #ffff00
! ! Blue + Bright Blue
! *.color4: #000080
! *.color12: #0000ff
! ! Magenta (Purple) + Bright Magenta
! ! *.color5: #800080
! *.color5: #af00d7
! *.color13: #0000ff
! ! Cyan (Aqua) + Bright Cyan
! ! *.color6: #800080
! *.color6: #008b8b
! ! *.color14: #ff00ff
! *.color14: #00d7ff
! ! Light Grey (Selection) + White (Current Line)
! *.color7: #c0c0c0
! *.color15: #ffffff
!## [U]XTERM !## [U]XTERM
*.selectToClipboard: true *.selectToClipboard: true
*.VT100saveLines: 4096 *.VT100saveLines: 4096
@ -129,16 +34,20 @@
*.VT100.background: black *.VT100.background: black
*.foreground: white *.foreground: white
*.VT100.foreground: white *.VT100.foreground: white
*.termName: xterm-256color *.termName: xterm-direct256
*.ttyModes: start ^- stop ^- *.ttyModes: start ^- stop ^-
*.boldMode: false *.boldMode: false
*.allowBoldFonts: false *.allowBoldFonts: false
*.colorMode: true
*.dynamicColors: true
*.colorBDMode: false
*.colorULMode: false
*.underline: false
*.VT100.geometry: 80x24 *.VT100.geometry: 80x24
*.VT100.scaleHeight: 1.1 *.VT100.scaleHeight: 1.1
! For some reason, '*scrollBar' was not working on Fedora. ! For some reason, '*scrollBar' was not working on Fedora.
XTerm*.scrollBar: false XTerm*.scrollBar: false
UXTerm*.scrollBar: false UXTerm*.scrollBar: false
*.colorBDMode: true
*.visualBell: false *.visualBell: false
*.eightBitInput: false *.eightBitInput: false
*.modifyCursorKeys: 2 *.modifyCursorKeys: 2