Repository: xonsh/xonsh

Issue:
Byobu Cannot Launch With Xonsh: ValueError: Could not translate ANSI color code '3;28' into a known color in the palette
## Expected Behavior
Byobu should lauch into xonsh

## Current Behavior
Falls back to `/bin/sh`; traceback given.

### Traceback (if applicable)

I have my bash shell running xonsh on terminal startup, with `XONSH_DEBUG` set to `1`. When running `byobu`, or attempting to attach to a `byobu session`, this happens:
```bash
Traceback (most recent call last):
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 24008, in main
    args = premain(argv)
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 23959, in premain
    env = start_services(shell_kwargs, args)
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 23894, in start_services
    cacheall=shell_kwargs.get("cacheall", False),
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 23020, in __init__
    load_builtins(execer=self, ctx=xonsh_ctx)
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 22751, in load_builtins
    builtins.__xonsh__.load(execer=execer, ctx=ctx)
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 22823, in load
    self.env = Env(default_env())
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 19249, in __init__
    self[key] = val
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 19411, in __setitem__
    val = ensurer.convert(val)
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 18302, in convert
    return cls.fromstring(x)
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 18265, in fromstring
    esc, "default", reversed_style=reversed_default
  File "/home/shadowrylander/mc3/lib/python3.7/site-packages/xonsh/__amalgam__.py", line 7184, in ansi_color_escape_code_to_name
    msg.format(escape_code=escape_code, names=names, name=name, n=n)
ValueError: Could not translate ANSI color code '3;28' into a known color in the palette. Specifically, the 'ITALIC_28' portion of '28' in ['ITALIC_', '28'] seems to missing.
Xonsh encountered an issue during launch
Failback to /bin/sh
$ 
```

## Steps to Reproduce
I have no idea how to reproduce this; this is my `bashrc` and `xonshrc`:
`bashrc:`
```bash
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
	# We have color support; assume it's compliant with Ecma-48
	# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
	# a case would tend to support setf rather than setaf.)
	color_prompt=yes
    else
	color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi
[ -r /home/shadowrylander/.byobu/prompt ] && . /home/shadowrylander/.byobu/prompt   #byobu-prompt#

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/shadowrylander/mc3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/home/shadowrylander/mc3/etc/profile.d/conda.sh" ]; then
        . "/home/shadowrylander/mc3/etc/profile.d/conda.sh"
    else
        export PATH="/home/shadowrylander/mc3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

# For Xonsh
alias n=exit
JAVA_HOME="/usr/lib/jvm/java-12-openjdk-amd64/bin/java"
XONSH_DEBUG=1
xonsh && clear
```
`xonshrc:`
```python
xontrib load kitty
xontrib load autojump
xontrib load bashisms
xontrib load coreutils
xontrib load direnv
xontrib load jedi

extra_paths = [
    "/home/shadowrylander/mc3/bin",
    "/home/shadowrylander/mc3/lib/python3.7/site-packages"
]
$PATH += extra_paths

if not bool($(ps -A | grep emacs)):
    emacs --daemon &> /dev/null

def _vim(args, stdin=None):
    emacsclient -t @(args[0])

def _la(args, stdin=None):
    if args:
        ls -la @(args[0])
    else:
        ls -la

$VI_MODE = True

# /s/borg/test/repo
$surface_borg_test = "temp"
def borgbegone(args, stdin=None):
    # borg prune
    pass

aliases["borgbegone"] = borgbegone
aliases["n"] = "exit"
aliases["vim"] = _vim
aliases["la"] = _la
```


Discussion:
This is related to the first statement by @ocelotl in #3039 as well.
Thanks for reporting this! I can reproduce this issue
No problem! Thank you for the shell! 😸😸😸😸

Resolving patch:
diff --git a/xonsh/ansi_colors.py b/xonsh/ansi_colors.py
--- a/xonsh/ansi_colors.py
+++ b/xonsh/ansi_colors.py
@@ -47,6 +47,14 @@ def ANSI_ESCAPE_MODIFIERS():
         "INVERT": "7",
         "CONCEAL": "8",
         "STRIKETHROUGH": "9",
+        "BOLDOFF": "21",
+        "FAINTOFF": "22",
+        "ITALICOFF": "23",
+        "UNDERLINEOFF": "24",
+        "BLINKOFF": "25",
+        "INVERTOFF": "27",
+        "REVEALOFF": "28",
+        "STRIKETHROUGHOFF": "29",
     }
 
 
@@ -194,6 +202,14 @@ def ansi_reverse_style(style="default", return_style=False):
         "7": "INVERT_",
         "8": "CONCEAL_",
         "9": "STRIKETHROUGH_",
+        "21": "BOLDOFF_",
+        "22": "FAINTOFF_",
+        "23": "ITALICOFF_",
+        "24": "UNDERLINEOFF_",
+        "25": "BLINKOFF_",
+        "27": "INVERTOFF_",
+        "28": "REVEALOFF_",
+        "29": "STRIKETHROUGHOFF_",
         "38": "SET_FOREGROUND_",
         "48": "SET_BACKGROUND_",
         "38;2": "SET_FOREGROUND_FAINT_",
diff --git a/xonsh/color_tools.py b/xonsh/color_tools.py
--- a/xonsh/color_tools.py
+++ b/xonsh/color_tools.py
@@ -74,7 +74,8 @@ def RE_XONSH_COLOR():
         r"((?P<background>BACKGROUND_)|(?P<modifiers>("
         # modifiers, only apply to foreground
         r"BOLD_|FAINT_|ITALIC_|UNDERLINE_|SLOWBLINK_|FASTBLINK_|INVERT_|CONCEAL_|"
-        r"STRIKETHROUGH_)+))?"
+        r"STRIKETHROUGH_|BOLDOFF_|FAINTOFF_|ITALICOFF_|UNDERLINEOFF_|BLINKOFF_|"
+        r"INVERTOFF_|REVEALOFF_|STRIKETHROUGHOFF_)+))?"
         # colors
         r"(?P<color>BLACK|RED|GREEN|YELLOW|BLUE|PURPLE|CYAN|WHITE|INTENSE_BLACK|"
         r"INTENSE_RED|INTENSE_GREEN|INTENSE_YELLOW|INTENSE_BLUE|INTENSE_PURPLE|"
diff --git a/xonsh/pyghooks.py b/xonsh/pyghooks.py
--- a/xonsh/pyghooks.py
+++ b/xonsh/pyghooks.py
@@ -294,6 +294,14 @@ def PYGMENTS_MODIFIERS():
         "INVERT": None,
         "CONCEAL": None,
         "STRIKETHROUGH": None,
+        "BOLDOFF": None,
+        "FAINTOFF": None,
+        "ITALICOFF": None,
+        "UNDERLINEOFF": None,
+        "BLINKOFF": None,
+        "INVERTOFF": None,
+        "REVEALOFF": None,
+        "STRIKETHROUGHOFF": None,
     }
 
 


Test patch:
diff --git a/tests/test_ansi_colors.py b/tests/test_ansi_colors.py
--- a/tests/test_ansi_colors.py
+++ b/tests/test_ansi_colors.py
@@ -53,6 +53,7 @@
         ("UNDERLINE_RED", "4;0;31"),
         ("BOLD_UNDERLINE_RED", "1;4;0;31"),
         ("UNDERLINE_BOLD_RED", "4;1;0;31"),
+        ("ITALIC_REVEALOFF_WHITE", "3;28;0;37"),
         # The hex code #000 can map to ANSI-256 0 or 16
         ("#000", {"38;5;0", "38;5;16"}),
         ("#000000", {"38;5;0", "38;5;16"}),
@@ -88,6 +89,7 @@ def test_ansi_reverse_style(key, value):
         ("00;36", ("CYAN",)),
         ("01;31", ("BOLD_RED",)),
         ("04;31", ("UNDERLINE_RED",)),
+        ("3;28", ("ITALIC_REVEALOFF_WHITE",)),
         ("1;4;31", ("BOLD_UNDERLINE_RED",)),
         ("4;1;31", ("UNDERLINE_BOLD_RED",)),
         ("31;42", ("RED", "BACKGROUND_GREEN")),