Skip to content

Commit

Permalink
fix color detect error on use screen
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed Apr 6, 2021
1 parent f9b4cd2 commit aaee2b3
Show file tree
Hide file tree
Showing 6 changed files with 159 additions and 26 deletions.
41 changes: 40 additions & 1 deletion _examples/ref/env-term-data.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,18 @@ TERM_SESSION_ID=F17907FE-DCA5-488D-829B-7AFA8B323753
ZSH_TMUX_TERM=screen-256color
```

use screen:

```bash
% env | grep -i term
TERM=screen
TERMCAP=SC|screen|VT 100/ANSI X3.64 virtual terminal:\
TERM_PROGRAM=Apple_Terminal
TERM_PROGRAM_VERSION=433
TERM_SESSION_ID=853CFB05-1F50-45A8-8F80-CF366958557E
ZSH_TMUX_TERM=screen
```

**zsh on iterm2**

```bash
Expand All @@ -154,6 +166,23 @@ ITERM_SESSION_ID=w0t2p0:3A53303E-BD72-4F1D-897D-EC15E3B4FDB5
ZSH_TMUX_TERM=screen-256color
```

use screen:

```bash
% env | grep -i term
TERM=screen
TERMCAP=SC|screen|VT 100/ANSI X3.64 virtual terminal:\
TERM_SESSION_ID=w0t2p0:3A53303E-BD72-4F1D-897D-EC15E3B4FDB5
LC_TERMINAL_VERSION=3.4.5beta1
ITERM_PROFILE=Default
TERM_PROGRAM_VERSION=3.4.5beta1
TERM_PROGRAM=iTerm.app
LC_TERMINAL=iTerm2
COLORTERM=truecolor
ITERM_SESSION_ID=w0t2p0:3A53303E-BD72-4F1D-897D-EC15E3B4FDB5
ZSH_TMUX_TERM=screen
```

**bin/zsh on JetBrains Terminal**

- support True color, but detect is `256`. so, need check `TERMINAL_EMULATOR`
Expand All @@ -165,12 +194,22 @@ TERMINAL_EMULATOR=JetBrains-JediTerm
ZSH_TMUX_TERM=screen-256color
```

use screen:

```bash
% env | grep -i term
TERM=screen
TERMCAP=SC|screen|VT 100/ANSI X3.64 virtual terminal:\
TERMINAL_EMULATOR=JetBrains-JediTerm
ZSH_TMUX_TERM=screen
```

**bin/zsh on Terminus Terminal**

- support True color, but detect is `256`. so, need check `TERM_PROGRAM`

```bash
% env | grep -i TERM :( 1 21-03-31 - 0:43:18
% env | grep -i TERM
TERMINUS_PLUGINS=
TERM=xterm-256color
TERM_PROGRAM=Terminus
Expand Down
6 changes: 3 additions & 3 deletions color_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -784,7 +784,7 @@ func mockEnvValue(key, val string, fn func(nv string)) {
}
}

func mockOsEnvironByText(envText string, fn func()) {
func mockOsEnvByText(envText string, fn func()) {
ss := strings.Split(envText, "\n")
mp := make(map[string]string, len(ss))
for _, line := range ss {
Expand All @@ -800,10 +800,10 @@ func mockOsEnvironByText(envText string, fn func()) {
}
}

mockOsEnviron(mp, fn)
mockOsEnv(mp, fn)
}

func mockOsEnviron(mp map[string]string, fn func()) {
func mockOsEnv(mp map[string]string, fn func()) {
envBak := os.Environ()

os.Clearenv()
Expand Down
14 changes: 12 additions & 2 deletions detect_env.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ func detectTermColorLevel() (level terminfo.ColorLevel, needVTP bool) {
// detectColorFromEnv returns the color level COLORTERM, FORCE_COLOR,
// TERM_PROGRAM, or determined from the TERM environment variable.
//
// refer terminfo.ColorLevelFromEnv()
// refer the terminfo.ColorLevelFromEnv()
func detectColorLevelFromEnv(termVal string) (terminfo.ColorLevel, error) {
// on TERM=screen: not support true-color
// termVal := os.Getenv("TERM")
Expand All @@ -104,6 +104,8 @@ func detectColorLevelFromEnv(termVal string) (terminfo.ColorLevel, error) {
if termVal == "screen" { // on TERM=screen: not support true-color
return terminfo.ColorLevelHundreds, nil
}

// check version
ver := os.Getenv("TERM_PROGRAM_VERSION")
if ver == "" {
return terminfo.ColorLevelHundreds, nil
Expand All @@ -125,17 +127,25 @@ func detectColorLevelFromEnv(termVal string) (terminfo.ColorLevel, error) {
return terminfo.ColorLevelNone, err
}

// on TERM=screen:
// - support 256, not support true-color. test on macOS
if termVal == "screen" {
return terminfo.ColorLevelHundreds, nil
}

v, ok := ti.Nums[terminfo.MaxColors]
switch {
case !ok || v <= 16:
return terminfo.ColorLevelNone, nil
case ok && v >= 256:
return terminfo.ColorLevelHundreds, nil
}
return terminfo.ColorLevelBasic, nil
}

// Not TERM env value. default return none level
return terminfo.ColorLevelNone, nil
// return terminfo.ColorLevelBasic, nil
return terminfo.ColorLevelNone, nil // default return none level
}

var detectedWSL bool
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ go 1.12
require (
github.com/stretchr/testify v1.6.1
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 // indirect
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44
)
1 change: 0 additions & 1 deletion go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
Expand Down
121 changes: 103 additions & 18 deletions utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,45 +36,130 @@ func TestUtilFuncs(t *testing.T) {
func TestDetectColorLevel(t *testing.T) {
is := assert.New(t)

// "COLORTERM=truecolor"
mockOsEnvByText("COLORTERM=truecolor", func() {
is.True(IsSupportColor())
is.Equal(LevelRgb, DetectColorLevel())
is.True(IsSupportRGBColor())
is.True(IsSupportTrueColor())
})

// TERMINAL_EMULATOR=JetBrains-JediTerm
mockOsEnvByText(`
TERM=xterm-256color
TERMINAL_EMULATOR=JetBrains-JediTerm
ZSH_TMUX_TERM=screen-256color
`, func() {
is.Equal(LevelRgb, DetectColorLevel())
is.True(IsSupportRGBColor())
is.True(IsSupport16Color())
is.True(IsSupportColor())
})

// TERM
mockOsEnvByText("TERM=screen-256color", func() {
is.Equal(Level256, DetectColorLevel())
is.False(IsSupportTrueColor())
is.True(IsSupport256Color())
is.True(IsSupportColor())
})
}

func TestIsDetectColorLevel_unix(t *testing.T) {
is := assert.New(t)

// -------- tests on macOS ---------

// TERM_PROGRAM=Apple_Terminal
mockOsEnvironByText(`
mockOsEnvByText(`
TERM_PROGRAM=Apple_Terminal
TERM=xterm-256color
TERM_PROGRAM_VERSION=433
TERM_SESSION_ID=F17907FE-DCA5-488D-829B-7AFA8B323753
ZSH_TMUX_TERM=screen-256color
`, func() {
// fmt.Println(os.Environ())
is.Equal(Level256, DetectColorLevel())
is.False(IsSupportTrueColor())
is.True(IsSupport256Color())
is.True(IsSupport16Color())
is.True(IsSupportColor())
})

// TERM_PROGRAM=iTerm.app
mockEnvValue("TERM_PROGRAM", "iTerm.app", func(val string) {
is.Equal("iTerm.app", val)
is.Equal(Level256, DetectColorLevel())
mockOsEnvByText(`
LC_TERMINAL_VERSION=3.4.5beta1
ITERM_PROFILE=Default
TERM_PROGRAM_VERSION=3.4.5beta1
TERM_PROGRAM=iTerm.app
LC_TERMINAL=iTerm2
COLORTERM=truecolor
TERM=xterm-256color
ITERM_SESSION_ID=w0t2p0:3A53303E-BD72-4F1D-897D-EC15E3B4FDB5
ZSH_TMUX_TERM=screen-256color
`, func() {
is.Equal(LevelRgb, DetectColorLevel())
is.True(IsSupportTrueColor())
is.True(IsSupport256Color())
is.True(IsSupport16Color())
is.True(IsSupportColor())
})

// TERMINAL_EMULATOR=JetBrains-JediTerm
mockEnvValue("TERMINAL_EMULATOR", "JetBrains-JediTerm", func(val string) {
is.Equal(LevelRgb, DetectColorLevel())
// -------- tests on linux ---------
}

func TestIsDetectColorLevel_screen(t *testing.T) {
is := assert.New(t)

// TERM_PROGRAM=Apple_Terminal use screen
mockOsEnvByText(`
TERM_PROGRAM=Apple_Terminal
TERM=xterm-256color
TERM_PROGRAM_VERSION=433
TERM_SESSION_ID=F17907FE-DCA5-488D-829B-7AFA8B323753
ZSH_TMUX_TERM=screen-256color
`, func() {
// fmt.Println(os.Environ())
is.Equal(Level256, DetectColorLevel())
is.False(IsSupportTrueColor())
is.True(IsSupport256Color())
is.True(IsSupport16Color())
is.True(IsSupportColor())
})

// "COLORTERM=truecolor"
mockEnvValue("COLORTERM", "truecolor", func(val string) {
is.Equal("truecolor", val)
// TERM_PROGRAM=iTerm.app use screen
mockOsEnvByText(`
TERM=screen
TERMCAP=SC|screen|VT 100/ANSI X3.64 virtual terminal:\
TERM_SESSION_ID=w0t2p0:3A53303E-BD72-4F1D-897D-EC15E3B4FDB5
LC_TERMINAL_VERSION=3.4.5beta1
ITERM_PROFILE=Default
TERM_PROGRAM_VERSION=3.4.5beta1
TERM_PROGRAM=iTerm.app
LC_TERMINAL=iTerm2
COLORTERM=truecolor
ITERM_SESSION_ID=w0t2p0:3A53303E-BD72-4F1D-897D-EC15E3B4FDB5
ZSH_TMUX_TERM=screen
`, func() {
is.Equal(Level256, DetectColorLevel())
is.False(IsSupportTrueColor())
is.True(IsSupport256Color())
is.True(IsSupport16Color())
is.True(IsSupportColor())
lv := DetectColorLevel()
is.Equal(LevelRgb, lv)
// is.Equal("COLORTERM=truecolor", mark)
is.True(IsSupportRGBColor())
is.True(IsSupportTrueColor())
})

// TERM
mockEnvValue("TERM", "screen-256color", func(_ string) {
// TERMINAL_EMULATOR=JetBrains-JediTerm use screen
mockOsEnvByText(`
TERM=screen
TERMCAP=SC|screen|VT 100/ANSI X3.64 virtual terminal:\
TERMINAL_EMULATOR=JetBrains-JediTerm
ZSH_TMUX_TERM=screen
`, func() {
is.Equal(Level256, DetectColorLevel())
is.False(IsSupportTrueColor())
is.True(IsSupport256Color())
is.True(IsSupport16Color())
is.True(IsSupportColor())
// is.Equal(Level256, DetectColorLevel())
})
}

Expand Down

0 comments on commit aaee2b3

Please sign in to comment.