我们在Go语言中有很多流行的包可以在终端中渲染彩色文本,例如fatih/color、gookit/color和lucasb-eyer/go-colorful。
然而,我现在遇到了一个问题——除了用肉眼观察之外,如何在Go语言中以编程方式检测当前终端是否支持16色或256色(即使在Windows上)?
然而,我现在遇到了一个问题——除了用肉眼观察之外,如何在Go语言中以编程方式检测当前终端是否支持16色或256色(即使在Windows上)?
如 "确定当前 Linux 控制台是否支持256种颜色?" 中所提到的(并且在 Windows 上也会存在相同的可移植性问题)
作为不可移植选项的例子,您可以使用 curses(在 Linux 上),如此处所述并在 curses.go中实现:
查看
tput colors
和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
}
}
github.com/nsf/termbox-go
)进行交互,但它除了通过“使用终端”与用户进行交互之外,在这种情况下别无其他方式。那么问题到底是什么呢? - kostix