go - 如何在 Go 中检测当前终端是否支持 16 色或 256 色?
问题描述
我们在 Go 中有许多流行的包来在终端中渲染彩色文本,例如fatih/color、gookit/color、lucasb-eyer/go-colorful。
但是我面临一个问题——除了亲眼所见之外,如何检测当前终端是否在 Go 中以编程方式支持 16 色或 256 色(即使在 Windows 上)?
解决方案
如“确定当前 Linux 控制台是否支持 256 色? ”中所述(即在 Linux 上,Windows 上也会存在相同的可移植性问题)
作为不可移植选项的示例,您可以使用 curses(在 Linux 上),如此处讨论并在curses.go中实现:
查看
tput colors
andtigetnum('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
}
}
推荐阅读
- java - 如何将文本文件中的不同列复制到变量中
- system-verilog - 如何在 systemverilog 中转换为 longint unsigned?
- javascript - Chart.js 点击事件打开自定义工具提示有时不起作用
- spring - Spring Batch - 根据条件循环回任何上一步
- swift - 有谁知道如何让它工作我正在尝试使用 pagecontrol 制作幻灯片,但索引显示错误
- floating-point - 手动将 Double 转换为 Float,反之亦然
- python - A* 实现的测试在 Python3.8/Windows 中通过,但在 Python3.5/Ubuntu 中失败
- asp.net - reCAPTCHA 在 Aspx 页面中不可见
- visual-studio - 我可以将 Visual Studio 的 Assisted IntelliSense 与 ReSharper 的建议系统一起使用吗?
- google-chrome - Chrome 排队请求