From 45a0acb222df1d6ea254d9b4679dae48d9051e5c Mon Sep 17 00:00:00 2001 From: Ben Grande Date: Tue, 11 Mar 2025 20:13:09 +0100 Subject: [PATCH] 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. --- files/dom0/.local/bin/dom0/qvm-stats | 3 +- files/qvm-copy-dotfiles | 14 +- files/sh/.config/bash/bashrc | 22 ++- files/sh/.config/sh/shrc | 275 +++++++++++++++++++++------ files/sh/.config/zsh/.zshrc | 34 ++-- files/sh/.local/bin/resize-terminal | 23 ++- files/tmux/.config/tmux/tmux.conf | 10 +- files/vim/.config/vim/vimrc | 5 +- files/x11/.config/x11/xresources | 111 +---------- 9 files changed, 297 insertions(+), 200 deletions(-) diff --git a/files/dom0/.local/bin/dom0/qvm-stats b/files/dom0/.local/bin/dom0/qvm-stats index 08d963c..ff5b31f 100755 --- a/files/dom0/.local/bin/dom0/qvm-stats +++ b/files/dom0/.local/bin/dom0/qvm-stats @@ -19,6 +19,7 @@ if ! command -v sensors >/dev/null; then fi redraw(){ + # shellcheck disable=SC2312 stty size &1 >&2 | read -r LINES COLUMNS tput ed home } @@ -44,7 +45,7 @@ get_header(){ if test "${sensors}" != "0"; then sensors | grep -E -e "^(fan[1-9]+|[C|G]PU|temp[1-9]+):" | 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 printf '%s%-40s %-6s %6s %8s%s\n' "${bold}" 'Qube' 'State' 'CPU(%)' \ 'MEM(MiB)' "${nobold}" diff --git a/files/qvm-copy-dotfiles b/files/qvm-copy-dotfiles index 6c41d5b..8956667 100755 --- a/files/qvm-copy-dotfiles +++ b/files/qvm-copy-dotfiles @@ -1,6 +1,6 @@ #!/bin/sh ## -## SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. +## SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. ## ## SPDX-License-Identifier: AGPL-3.0-or-later ## @@ -28,14 +28,14 @@ test -f ./setup.sh || if test "${qube}" = "dom0"; then sh ./dotfiles/setup.sh - user_name="$(getent group qubes | awk -F "[:,]" '{print $4}')" - user_home="$(getent passwd "${user_name}" | awk -F ":" '{print $6}')" - sudo -u "${user_name}" mkdir -pv -- "${user_home}/.cache" - tmpdir="$(sudo -u "${user_name}" -- mktemp -d -- "${user_home}/.cache/XXXXXX")" + user="$(getent group qubes | awk -F "[:,]" '{print $4}')" + home="$(getent passwd "${user}" | awk -F ":" '{print $6}')" + sudo -u "${user}" mkdir -pv -- "${home}/.cache" + tmpdir="$(sudo -u "${user}" -- mktemp -d -- "${home}/.cache/XXXXXX")" trap 'rm -rf -- "${tmpdir}"' EXIT INT HUP QUIT ABRT cp -r -- ./dotfiles "${tmpdir}" - chown -R -- "${user_name}:${user_name}" "${tmpdir}" - sudo -u "${user_name}" -- "${tmpdir}/dotfiles/setup.sh" + chown -R -- "${user}:${user}" "${tmpdir}" + sudo -u "${user}" -- "${tmpdir}/dotfiles/setup.sh" exit fi diff --git a/files/sh/.config/bash/bashrc b/files/sh/.config/bash/bashrc index d62f6e8..6f9cda7 100644 --- a/files/sh/.config/bash/bashrc +++ b/files/sh/.config/bash/bashrc @@ -1,6 +1,6 @@ #!/usr/bin/env bash -## SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. +## SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. ## ## 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. ## Otherwise ask the terminal for current column and read it from input. 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 unset cur_y ## Print line ending char with reversed video and end with newline. 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 - printf '%b' "%\n\r" + printf '%s\n\r' "%" fi fi } @@ -76,9 +78,11 @@ _reset_line() { _print_ec(){ test "${_ec_ps1}" = "0" && return 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 - printf '%s' "(${_ec_ps1})" + printf '(%s)' "${_ec_ps1}" fi unset _ec_ps1 } @@ -90,10 +94,10 @@ newline=$'\n' # shellcheck disable=SC2154 if test "${color_prompt:-}" = "yes"; then # 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}\[${dircolor}\]\w\[${reset_color}\]\$(_git_prompt_info)" - PS1="${PS1}\[\033[35m\]]\[${reset_color}\]${newline-}\$(_print_ec)" + PS1="${PS1}\[${dircolor}\]\w\[${_t_sgr0}\]\$(_git_prompt_info)" + PS1="${PS1}\[${_t_setaf_5}\]]\[${_t_sgr0}\]${newline-}\$(_print_ec)" PS1="${PS1}${ps1_symbol} " else PS1="\$(_reset_line)\$(resize-terminal)" diff --git a/files/sh/.config/sh/shrc b/files/sh/.config/sh/shrc index 4c1916f..f975949 100644 --- a/files/sh/.config/sh/shrc +++ b/files/sh/.config/sh/shrc @@ -1,7 +1,7 @@ #!/bin/sh ## SPDX-FileCopyrightText: 2004 - 2022 Tim Pope -## SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. +## SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. ## ## SPDX-License-Identifier: AGPL-3.0-or-later @@ -157,27 +157,196 @@ fi ## }}} ## }}} ## {{{ Prompt -## Set ability to color terminal. -# shellcheck disable=2034 -case "${TERM-}" in - iterm|*-truecolor) - export COLORTERM=truecolor; color_prompt=yes - ;; - *-color|*-256color|linux*|vt100*|vt220*) - color_prompt=yes - ;; - ""|dumb) - color_prompt=no - ;; - *) - color_prompt=no - ;; -esac -if test -n "${NO_COLOR-}"; then - color_prompt=no -fi +# shellcheck disable=SC2034 +_get_term_cap(){ + ## SGR + _t_colors="$(tput colors)" 2>/dev/null || true + _t_sgr0="$(tput sgr0)" 2>/dev/null || true + _t_bold="$(tput bold)" 2>/dev/null || true + _t_dim="$(tput dim)" 2>/dev/null || true + _t_sitm="$(tput sitm)" 2>/dev/null || true + _t_smul="$(tput smul)" 2>/dev/null || true + _t_blink="$(tput blink)" 2>/dev/null || true + _t_rev="$(tput rev)" 2>/dev/null || true + _t_smso="$(tput rmso)" 2>/dev/null || true + _t_invis="$(tput invis)" 2>/dev/null || true + _t_ritm="$(tput ritm)" 2>/dev/null || true + _t_rmul="$(tput rmul)" 2>/dev/null || true + _t_rmso="$(tput rmso)" 2>/dev/null || true + _t_setaf_0="$(tput setaf 0)" 2>/dev/null || true + _t_setaf_1="$(tput setaf 1)" 2>/dev/null || true + _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 has dircolors; then ## Use dircolors if available. @@ -192,7 +361,8 @@ if test "${color_prompt-}" = "yes"; then ## Fix bold on some terminals. case "${TERM-}" in 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 @@ -203,22 +373,21 @@ if test "${color_prompt-}" = "yes"; then export CLICOLOR CLICOLOR_FORCE LSCOLORS fi - ## Set gcc colors. GCC_COLORS="error=00;31:warning=01;35:note=01;36:caret=01;32:locus=01" GCC_COLORS="${GCC_COLORS}:quote=01" 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 - LESS_TERMCAP_mb="$(tput bold; tput setaf 2)" # begin blink - LESS_TERMCAP_md="$(tput bold; tput setaf 6)" # begin bold - LESS_TERMCAP_me="$(tput sgr0)" # reset bold/blink - LESS_TERMCAP_so="$(tput bold; tput setaf 7; tput setab 4)" # begin rev video - LESS_TERMCAP_se="$(tput rmso; tput sgr0)" # reset rev video - LESS_TERMCAP_us="$(tput smul; tput bold; tput setaf 2)" # begin underline - LESS_TERMCAP_ue="$(tput rmul; tput sgr0)" # reset underline - LESS_TERMCAP_mr="$(tput rev)" # revert - LESS_TERMCAP_mh="$(tput dim)" # dimerize + LESS_TERMCAP_mb="${_t_bold}${_t_setaf_2}" + LESS_TERMCAP_md="${_t_bold}${_t_setaf_6}" + LESS_TERMCAP_me="${_t_sgr0}" + LESS_TERMCAP_so="${_t_bold}${_t_setaf_7}${_t_setab_4}" + LESS_TERMCAP_se="${_t_rmso}${_t_sgr0}" + LESS_TERMCAP_us="${_t_smul}${_t_bold}${_t_setaf_2}" + LESS_TERMCAP_ue="${_t_rmul}${_t_sgr0}" + LESS_TERMCAP_mr="${_t_rev}" + LESS_TERMCAP_mh="${_t_dim}" export GROFF_NO_SGR export LESS_TERMCAP_mb LESS_TERMCAP_md LESS_TERMCAP_me 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)" test "${ref-}" || ref="$(git rev-parse HEAD 2>/dev/null | cut -c 1-7)" test "${ref-}" || return - # shellcheck disable=2039,3003 - case "${TERM-}" in - *-256color|xterm-kitty) branchcolor=$'\033[38;5;31m' ;; - *-88color|rxvt-unicode) branchcolor=$'\033[38;5;22m' ;; - *) branchcolor=$'\033[0;94m' ;; + case "${color_support-}" in + 256|$((1 << 24))) branchcolor="$(printf '%b' "\033[38;5;31m")";; + 88) branchcolor="$(printf '%b' "\033[38;5;22m")";; + [1-9]*) branchcolor="${_t_bold}${_t_setaf_4}";; + *) branchcolor="";; esac if test -n "${ZSH_VERSION-}"; then # shellcheck disable=2016 if test "${color_prompt-}" = "yes"; then - print -Pn '(%%{${branchcolor}%%}%20>...>${ref}%<<%%{\033[0m%%})' + print -Pn '(%%{${branchcolor}%%}%20>...>${ref}%<<%%{${_t_sgr0}%%})' else print -Pn '(%20>...>${ref}%<<)' fi else if test "${color_prompt-}" = "yes"; then - printf '%s' "(${branchcolor}${ref}${reset_color})" + printf '%s' "(${branchcolor}${ref}${_t_sgr0})" else printf '%s' "(${ref})" fi fi - unset ref + unset ref branchcolor } # shellcheck disable=SC2034 -reset_color="$(printf '%b' '\033[0m')" - -# shellcheck disable=SC2034 -## Use echotc Co? Only available by default for zsh, not bash. -case "${TERM-}" in - *-256color|xterm-kitty) +case "${color_support-}" in + 256|$((1 << 24))) usercolor="$(printf '%b' "\033[38;5;184m")" dircolor="$(printf '%b' "\033[38;5;27m")" ;; - *-88color|rxvt-unicode) + 88) usercolor="$(printf '%b' "\033[38;5;56m")" 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")" - dircolor="$(printf '%b' "\033[1;34m")" + usercolor="" + dircolor="" ;; esac @@ -297,16 +466,14 @@ esac # shellcheck disable=SC2034 uid="$(id -u)" if test "${uid}" = "0"; then - usercolor="$(printf '%b' "\033[0;97m")" + usercolor="${_t_bold}${_t_setaf_7}" ps1_symbol="#" fi 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)" 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 PS1="${user}@$(hostname -s)${ps1_symbol} " fi diff --git a/files/sh/.config/zsh/.zshrc b/files/sh/.config/zsh/.zshrc index cb8ce37..65bb5d2 100644 --- a/files/sh/.config/zsh/.zshrc +++ b/files/sh/.config/zsh/.zshrc @@ -1,7 +1,7 @@ #!/usr/bin/env zsh ## SPDX-FileCopyrightText: 2004 - 2022 Tim Pope -## SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. +## SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. ## ## SPDX-License-Identifier: AGPL-3.0-or-later @@ -20,6 +20,7 @@ source "$HOME/.zprofile" source "$ENV" ## }}} ## {{{ Options +PROMPT_EOL_MARK='%b%B%S%#%s%b' ## - Quiet setopt no_beep ## - Words @@ -74,10 +75,10 @@ if test "${color_prompt-}" = "yes"; then [[ "${COLORTERM-}" == (24bit|truecolor) || "${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}%F{magenta}]%F{reset_color}${newline-}${ps1_symbol} " - RPS1="%(?..(%{"$'\033[31m'"%}%?%{$reset_color%}%)%<<)" + RPS1="%(?..(%F{red%}%?%F{reset_color%}%)%<<)" else PS1="\$(resize-terminal)[%n@%M %~\$(_git_prompt_info)]${newline}" PS1="${PS1}${ps1_symbol} " @@ -103,7 +104,6 @@ case "${TERM-}" in precmd() { _set_title "$@" if [ "${STY:-}" -o "${TMUX:-}" ]; then - print -Pn '\033]1;\a\033]1;@%m\a' print -Pn '\033k@\033\\' else print -Pn '\033k@%m\033\\' @@ -111,17 +111,17 @@ case "${TERM-}" in } preexec() { _set_title "$@" - print -n "\033k" - print -Pnr '%10>..>$1' | tr '\0-\037' '?' - if [ "${STY:-}" -o "${TMUX:-}" ]; then - print -Pn '@\033\\' - else - print -Pn '@%m\033\\' - fi + return 0 + #print -Pnr '%10>..>$1' | tr '\0-\037' '?' + #if [ "${STY:-}" -o "${TMUX:-}" ]; then + # print -Pn '\033k@\033\\' + #else + # print -Pn '\033k@%m\033\\' + #fi } ;; - xterm*|rxvt*|Eterm*|kterm*|putty*|dtterm*|ansi*|cygwin*) + *?-direct*|xterm*|rxvt*|Eterm*|kterm*|putty*|dtterm*|ansi*|cygwin*) precmd () { _set_title "$@" } preexec() { _set_title "$@" } ;; @@ -134,8 +134,8 @@ case "${TERM-}" in ;; esac -unset hostcolor hostletter hostcode dircolor usercolor usercode reset_color \ - newline ps1_symbol +unset hostcolor hostletter hostcode dircolor usercolor usercode newline \ + ps1_symbol ## }}} ## {{{ Completions @@ -224,9 +224,10 @@ if test "${color_prompt-}" = "yes"; then ## Enable auto-suggestions based on the history if test -f /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh; then 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 - 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 fi ## Highlight commands as you type @@ -236,7 +237,6 @@ if test "${color_prompt-}" = "yes"; then ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern regexp) typeset -A ZSH_HIGHLIGHT_STYLES ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=red' - ZSH_HIGHLIGHT_STYLES[default]='fg=white' ZSH_HIGHLIGHT_STYLES[alias]='fg=cyan' ZSH_HIGHLIGHT_STYLES[function]='fg=cyan' ZSH_HIGHLIGHT_STYLES[builtin]='fg=green' diff --git a/files/sh/.local/bin/resize-terminal b/files/sh/.local/bin/resize-terminal index 31f6fe2..7328e84 100755 --- a/files/sh/.local/bin/resize-terminal +++ b/files/sh/.local/bin/resize-terminal @@ -14,8 +14,10 @@ if test -n "${TERM_RESIZE_DISABLE:-}"; then fi test -t 0 || exit 0 - -msg_unsupported="error: cannot resize screen: unsupported terminal emulator" +case "${TERM-}" in + dumb) exit 0;; + *);; +esac ## If argument is provided, allow user to bypass tty check. if test "${#}" -eq 0; then @@ -46,15 +48,17 @@ if test "${#}" -eq 0; then unset term_file_active fi -sc="$(tput sc || printf '%b' '\0337')" -rc="$(tput rc || printf '%b' '\0338')" -cup="$(tput cup 99999 99999 || printf '%b' '\033[99999;99999H')" -csr="$(tput csr || printf '%b' '\033[r')" -gc="$(tput u7 || printf '%b' '\033[6n')" +get_caps(){ + sc="$(tput sc || printf '%b' '\0337')" + rc="$(tput rc || printf '%b' '\0338')" + cup="$(tput cup 99999 99999 || printf '%b' '\033[99999;99999H')" + csr="$(tput csr || printf '%b' '\033[r')" + gc="$(tput u7 || printf '%b' '\033[6n')" +} ## POSIX compliant. # 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. if has resize; then resize_cmd="$(resize)" @@ -62,6 +66,7 @@ if ! printf '%s\n' "R" | read -r -t 1 -sd R 2>/dev/null; then exit 0 fi ## Slow due to heavy stty calls. + get_caps termios="$(stty -g)" stty raw -echo min 0 time 1 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 fi +msg_unsupported="error: cannot resize screen: unsupported terminal emulator" ## Non-POSIX compliant and fast. +get_caps stty -echo printf '%s' "${sc}${csr}${cup}${gc}${rc}" >/dev/tty # shellcheck disable=3045,SC2034 diff --git a/files/tmux/.config/tmux/tmux.conf b/files/tmux/.config/tmux/tmux.conf index 045fb28..732e1e8 100644 --- a/files/tmux/.config/tmux/tmux.conf +++ b/files/tmux/.config/tmux/tmux.conf @@ -1,6 +1,6 @@ ## tmux.conf -## SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. +## SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. ## ## 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 escape-time 50 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-time 2000 set-option -g focus-events on diff --git a/files/vim/.config/vim/vimrc b/files/vim/.config/vim/vimrc index 039707c..8d58ad8 100644 --- a/files/vim/.config/vim/vimrc +++ b/files/vim/.config/vim/vimrc @@ -1,5 +1,5 @@ " SPDX-FileCopyrightText: 2004 - 2022 Tim Pope -" SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. +" SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. " " SPDX-License-Identifier: Vim " @@ -556,6 +556,9 @@ if (&t_Co > 2 || has('gui_running')) && has('syntax') endif if has('vim_starting') set list + if has('termguicolors') && &t_Co > 256 + setglobal termguicolors + endif if !exists('g:colors_name') colorscheme vividchalk endif diff --git a/files/x11/.config/x11/xresources b/files/x11/.config/x11/xresources index dd0ea48..219904d 100644 --- a/files/x11/.config/x11/xresources +++ b/files/x11/.config/x11/xresources @@ -1,15 +1,14 @@ ! ~/.Xresources - +! vim:set foldmethod=expr foldexpr=getline(v\:lnum)=~'^!##'?'>1'\:'=': ! SPDX-FileCopyrightText: 2004 - 2016 Tim Pope -! SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. +! SPDX-FileCopyrightText: 2023 - 2025 Benjamin Grande M. S. ! ! SPDX-License-Identifier: AGPL-3.0-or-later - +! ! Credits: https://github.com/tpope/dotfiles/blob/master/.Xresources -! vim:set foldmethod=expr foldexpr=getline(v\:lnum)=~'^!##'?'>1'\:'=': *international: true -*customization: -color +*customization: -color !## TERMINAL COMMON #ifndef FIXED @@ -24,100 +23,6 @@ #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 *.selectToClipboard: true *.VT100saveLines: 4096 @@ -129,16 +34,20 @@ *.VT100.background: black *.foreground: white *.VT100.foreground: white -*.termName: xterm-256color +*.termName: xterm-direct256 *.ttyModes: start ^- stop ^- *.boldMode: false *.allowBoldFonts: false +*.colorMode: true +*.dynamicColors: true +*.colorBDMode: false +*.colorULMode: false +*.underline: false *.VT100.geometry: 80x24 *.VT100.scaleHeight: 1.1 ! For some reason, '*scrollBar' was not working on Fedora. XTerm*.scrollBar: false UXTerm*.scrollBar: false -*.colorBDMode: true *.visualBell: false *.eightBitInput: false *.modifyCursorKeys: 2