[New] add nvm_has_italics, to detect terminal italics support via terminfo

This commit is contained in:
Jordan Harband
2026-09-29 17:08:36 +09:00
parent 09822033d2
commit 04fbd9570c
2 changed files with 86 additions and 1 deletions
+6 -1
View File
@@ -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 \
+80
View File
@@ -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" <<EOF
#!/bin/sh
echo "\$*" > "${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