首页 > 解决方案 > 如何在 Go 中检测当前终端是否支持 16 色或 256 色?

问题描述

我们在 Go 中有许多流行的包来在终端中渲染彩色文本,例如fatih/colorgookit/colorlucasb-eyer/go-colorful

但是我面临一个问题——除了亲眼所见之外,如何检测当前终端是否在 Go 中以编程方式支持 16 色或 256 色(即使在 Windows 上)?

标签: goterminalcommand-line-interfacettyterminal-color

解决方案


如“确定当前 Linux 控制台是否支持 256 色? ”中所述(即在 Linux 上,Windows 上也会存在相同的可移植性问题)

作为不可移植选项的示例,您可以使用 curses(在 Linux 上),如此处讨论并在curses.go中实现:

查看tput colorsand tigetnum('colors')(返回 1、8、256 或更大的数字)更符合功能测试的路线,这不那么骇人听闻,而且更具前瞻性。

func Init(theme *ColorTheme, black bool, mouse bool) {
    {
        in, err := os.OpenFile("/dev/tty", syscall.O_RDONLY, 0)
        if err != nil {
            panic("Failed to open /dev/tty")
        }
        _in = in
        // Break STDIN
        // syscall.Dup2(int(in.Fd()), int(os.Stdin.Fd()))
    }

    C.setlocale(C.LC_ALL, C.CString(""))
    _screen = C.c_newterm()
    if _screen == nil {
        fmt.Println("Invalid $TERM: " + os.Getenv("TERM"))
        os.Exit(2)
    }
    C.set_term(_screen)
    if mouse {
        C.mousemask(C.ALL_MOUSE_EVENTS, nil)
    }
    C.noecho()
    C.raw() // stty dsusp undef

    if theme != nil {
        C.start_color()
        var baseTheme *ColorTheme
        if C.tigetnum(C.CString("colors")) >= 256 {
            baseTheme = Dark256
        } else {
            baseTheme = Default16
        }
        initPairs(baseTheme, theme, black)
        _color = attrColored
    } else {
        _color = attrMono
    }
}

推荐阅读