From 04fbd9570cd46fa464e3c89653c288975dd1a91f Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Tue, 29 Sep 2026 17:08:36 +0900 Subject: [PATCH] [New] add `nvm_has_italics`, to detect terminal italics support via terminfo --- nvm.sh | 7 ++- test/fast/Unit tests/nvm_has_italics | 80 ++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100755 test/fast/Unit tests/nvm_has_italics diff --git a/nvm.sh b/nvm.sh index 382e174c..446fc035 100755 --- a/nvm.sh +++ b/nvm.sh @@ -101,6 +101,11 @@ nvm_has_colors() { [ -t 1 ] && [ "${NVM_NUM_COLORS:--1}" -ge 8 ] && [ "${NVM_NO_COLORS-}" != '--no-colors' ] } +# terminals without italics may render the italic escape as reverse video instead, so check terminfo's `sitm` capability +nvm_has_italics() { + nvm_has_colors && command tput -T "${TERM:-vt100}" sitm >/dev/null 2>&1 +} + nvm_curl_libz_support() { command curl -V 2>/dev/null | nvm_grep "^Features:" | nvm_grep -q "libz" } @@ -5061,7 +5066,7 @@ nvm() { nvm_install_lock_name nvm_acquire_install_lock nvm_release_install_lock \ nvm_list_aliases nvm_make_alias nvm_print_alias_file nvm_print_alias_path \ nvm_print_default_alias nvm_print_formatted_alias nvm_resolve_local_alias \ - nvm_sanitize_path nvm_has_colors nvm_process_parameters \ + nvm_sanitize_path nvm_has_colors nvm_has_italics nvm_process_parameters \ nvm_node_version_has_solaris_binary nvm_iojs_version_has_solaris_binary \ nvm_curl_libz_support nvm_command_info nvm_is_zsh nvm_stdout_is_terminal \ nvm_npmrc_bad_news_bears nvm_sanitize_auth_header \ diff --git a/test/fast/Unit tests/nvm_has_italics b/test/fast/Unit tests/nvm_has_italics new file mode 100755 index 00000000..a7f89702 --- /dev/null +++ b/test/fast/Unit tests/nvm_has_italics @@ -0,0 +1,80 @@ +#!/bin/sh + +WORK="${PWD}/nvm-has-italics-work.$$" +FAKE_BIN="${WORK}/bin" +TPUT_LOG="${WORK}/tput.log" + +cleanup() { + command rm -rf "${WORK}" + unset -f cleanup die nvm_has_colors +} +die () { echo "$@" ; cleanup ; exit 1; } + +: nvm.sh +\. ../../../nvm.sh + +nvm_has_colors() { return 0; } + +command mkdir -p "${FAKE_BIN}" +command cat > "${FAKE_BIN}/tput" < "${TPUT_LOG}" +command printf '\033[3m' +exit "\${FAKE_TPUT_STATUS-0}" +EOF +command chmod +x "${FAKE_BIN}/tput" + +( + export PATH="${FAKE_BIN}:${PATH}" TERM=xterm-256color + nvm_has_italics +) || die 'nvm_has_italics should be true when terminfo has the sitm capability' +[ "$(command cat "${TPUT_LOG}")" = '-T xterm-256color sitm' ] \ + || die "nvm_has_italics should query sitm for the current TERM; got >$(command cat "${TPUT_LOG}")<" + +OUTPUT="$( + export PATH="${FAKE_BIN}:${PATH}" TERM=xterm-256color + nvm_has_italics +)" +[ -z "${OUTPUT}" ] \ + || die "nvm_has_italics should not print the escape sequence; got >${OUTPUT}<" + +( + export PATH="${FAKE_BIN}:${PATH}" TERM=screen FAKE_TPUT_STATUS=1 + ! nvm_has_italics +) || die 'nvm_has_italics should be false when terminfo lacks the sitm capability' + +( + export PATH="${FAKE_BIN}:${PATH}" TERM=not-a-terminal FAKE_TPUT_STATUS=3 + ! nvm_has_italics +) || die 'nvm_has_italics should be false when the terminal is unknown' + +( + export PATH="${FAKE_BIN}:${PATH}" + unset TERM + nvm_has_italics +) || die 'nvm_has_italics should query vt100 when TERM is unset' +[ "$(command cat "${TPUT_LOG}")" = '-T vt100 sitm' ] \ + || die "nvm_has_italics should fall back to vt100 when TERM is unset; got >$(command cat "${TPUT_LOG}")<" + +( + PATH="${WORK}" + ! nvm_has_italics +) || die 'nvm_has_italics should be false when tput is unavailable' + +command rm -f "${TPUT_LOG}" +( + export PATH="${FAKE_BIN}:${PATH}" TERM=xterm-256color + nvm_has_colors() { return 1; } + ! nvm_has_italics +) || die 'nvm_has_italics should be false when colors are disabled' +[ ! -f "${TPUT_LOG}" ] \ + || die 'nvm_has_italics should not query terminfo when colors are disabled' + +if nvm_has tput; then + ( + export TERM=dumb + ! nvm_has_italics + ) || die 'nvm_has_italics should be false for the dumb terminal' +fi + +cleanup