如何在 Go 语言中检测当前终端是否支持 16 色或 256 色?

3
我们在Go语言中有很多流行的包可以在终端中渲染彩色文本,例如fatih/colorgookit/colorlucasb-eyer/go-colorful
然而,我现在遇到了一个问题——除了用肉眼观察之外,如何在Go语言中以编程方式检测当前终端是否支持16色或256色(即使在Windows上)?

对于 Unix 终端来说,可以使用 这个链接。不过我不清楚 Windows 控制台怎么做。 - kostix
@kostix 它正在使用终端本身。但是如何在终端中启动的 Go cli 应用程序中检测到这一点呢? - Wu Shanhe
我不是很理解:“在终端中启动的 Go CLI 应用程序”这个定义,它与所述终端进行交互 —— 它可能会使用专门的包(例如 github.com/nsf/termbox-go)进行交互,但它除了通过“使用终端”与用户进行交互之外,在这种情况下别无其他方式。那么问题到底是什么呢? - kostix
1个回答

0

如 "确定当前 Linux 控制台是否支持256种颜色?" 中所提到的(并且在 Windows 上也会存在相同的可移植性问题)

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

查看 tput colorstigetnum('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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接