}
alias isutfenv=axzsh_is_utf_terminal
-# Check if terminal supports "wide" characters.
+# Get the length of a string when shown on the terminal. The return code of the
+# function is the length in "cells". Note: Echo'ing the length to the terminal,
+# which looks cleaner at first, doesn't work: this command can't be called with
+# its stdin and/or stdout redirected, as it it must be able to interact with the
+# terminal (write to and read from it).
+function axzsh_get_displayed_length {
+ echo -ne "$*\033[6n"
+ read -s -d\[ garbage
+ read -s -d R pos
+ echo -ne "\033[1K\r"
+ return $((${pos#*;} - 1))
+}
+
+# Check if terminal correctly handles "wide" characters, which means, displays
+# them with the correct width (>1).
# <https://unix.stackexchange.com/questions/184345/detect-how-much-of-unicode-my-terminal-supports-even-through-screen>
typeset -g _axzsh_is_widechar_terminal_cache
function axzsh_is_widechar_terminal {
[[ -t 1 ]] || return 1
[[ -z "$AXZSH_PLUGIN_CHECK" ]] || return 1
axzsh_is_utf_terminal || return 1
- echo -ne "🍀\033[6n"
- read -s -d\[ garbage
- read -s -d R pos
- echo -ne "\033[1K\r"
- [[ "${pos#*;}" -eq 2 ]] || return 1
- return 0
+ axzsh_get_displayed_length "🍀"
+ [[ $? -eq 2 ]] && return 0 || return 1
}
# Test for "modern" terminal
PS1="$(ax_logname_prompt_yn)$(ax_hostname_prompt_yn)%B%2~%b"'$(ax_vcs_prompt)'"$(ax_prompt)"
# Primary prompt on the right-hand side.
-axzsh_is_widechar_terminal \
+axzsh_is_utf_terminal \
&& RPS1="%(?..%{$fg_no_bold[red]%}%? ↵%{$reset_color%})" \
|| RPS1="%(?..%{$fg_no_bold[red]%}<%?>%{$reset_color%})"
ZSH_THEME_PROMPT_PREFIX_SPACING=" "
ZSH_THEME_PROMPT_SUFFIX_SPACING=" "
-if axzsh_is_widechar_terminal; then
+if axzsh_is_utf_terminal; then
# UTF8 capable terminal:
if [[ -r "$HOME/.system_emoji-$SHORT_HOST" ]]; then
system_emoji=$(<"$HOME/.system_emoji-$SHORT_HOST")
else
system_emoji="🍀"
fi
- [[ -n "$VTE_VERSION" ]] \
+ axzsh_is_widechar_terminal \
&& emoji_spacing="" \
|| emoji_spacing=" "