Fix axzsh_is_widechar_terminal() logic
authorAlexander Barton <alex@barton.de>
Sat, 21 Mar 2020 13:14:19 +0000 (14:14 +0100)
committerAlexander Barton <alex@barton.de>
Sat, 21 Mar 2020 13:14:19 +0000 (14:14 +0100)
axzsh_is_widechar_terminal() returns 0 when the terminal CAN'T display
wiede characters in multiple columns, and non-null, when the terminal
CAN display wide characters.

Fix themes accordingly.

core/11_terminal/11_terminal.zshrc
themes/ax.axzshtheme
themes/axemoji.axzshtheme

index 3990129368f10b44c800fbb280b9e49f5cfabef8..a15c1d4137ca54a1dcfed630d5a8efa6b5b8a366 100644 (file)
@@ -21,7 +21,21 @@ function axzsh_is_utf_terminal {
 }
 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 {
@@ -36,12 +50,8 @@ 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
index 93eb88a0529b263f771504be8bd32c11eb111760..0a4eda4a6c285c8143f3ef2bd7fa9e0ddb91cb20 100644 (file)
@@ -16,7 +16,7 @@ ax_hostname_prompt_functions=($ax_hostname_prompt_functions ax_hostname_prompt_r
 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%})"
 
index febacdce1ddd30ffe8b4718d83ff1ac2ba77ac3a..331a3221fd1aa953701a7bda2faf079e315382af 100644 (file)
@@ -4,7 +4,7 @@
 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")
@@ -13,7 +13,7 @@ if axzsh_is_widechar_terminal; then
        else
                system_emoji="🍀"
        fi
-       [[ -n "$VTE_VERSION" ]] \
+       axzsh_is_widechar_terminal \
                && emoji_spacing="" \
                || emoji_spacing=" "