【问题标题】:Ansi colours on Windows 10, sort of not workingWindows 10 上的 Ansi 颜色,有点不工作
【发布时间】:2017-01-30 08:11:23
【问题描述】:

带有颜色的控制台对于 Windows 来说是相当新的和令人兴奋的 :-)

I wrote some programs that printed using the ansi colour escapes and all was good ...

...然后它突然停止工作。或者至少在我的笔记本电脑 Windows 10.0.14393 上停止

在我的机器上失败的应用程序在一个 nodejs 应用程序显示颜色的控制台中执行此操作,相同的二进制文件在另一台笔记本电脑上以正确的颜色运行。

golang fmt.Println("\033[31mSome Text\033[0m")

左上角,控制台节点输出,左下角,我的应用失败,右 vscode

httpDump.exe 是这个演示的名称(以防混淆)

它确实在 vscode 集成终端窗口中正确显示。

我已尝试删除HKLM\Console 注册表项并重新启动(多次)。我删除了可能包含设置的快捷方式。我试过在这台机器上以另一个用户身份运行(不起作用)

我欢迎任何提示。

【问题讨论】:

  • 如果您自己需要它,请安装理解 ANSI 转义序列的 ConEmu (conemu.github.io) 终端仿真器。它适用于 ConEmu 工作的任何 Windows 版本。
  • 我使用过这个和其他类似的终端,但是一旦 Windows 10 原生支持键盘复制/粘贴和 ANSI 控制代码(或至少一些颜色),我就停止了。我可能有一个副本来尝试看看它是否会导致任何地方。谢谢保罗。
  • @Plato,这个库非常具体地声明了 noop on Windows 。在非 Windows 版本上,它完全符合我的要求。正如我所说,我的程序曾经可以工作(我没有更改它),但是其他一些本地系统更改导致它不再工作。不过谢谢你的想法。

标签: windows go terminal


【解决方案1】:

您可以仅使用标准库包启用虚拟终端处理:

init_windows.go

//go:build windows

package main

import (
    "os"
    "syscall"
)

func init() {
    stdout := syscall.Handle(os.Stdout.Fd())

    var originalMode uint32
    syscall.GetConsoleMode(stdout, &originalMode)
    originalMode |= 0x0004
    
    syscall.MustLoadDLL("kernel32").MustFindProc("SetConsoleMode").Call(uintptr(stdout), uintptr(originalMode))
}

【讨论】:

    【解决方案2】:

    自该更新以来,您必须在 Windows 上启用虚拟终端处理。

    我通常添加一个文件init_windows.go,它在windows中设置它但也与其他操作系统兼容:

    // +build windows
    
    package main
    
    import (
        "os"
    
        "golang.org/x/sys/windows"
    )
    
    func init() {
        stdout := windows.Handle(os.Stdout.Fd())
        var originalMode uint32
    
        windows.GetConsoleMode(stdout, &originalMode)
        windows.SetConsoleMode(stdout, originalMode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING)
    }
    

    复制自:https://github.com/sirupsen/logrus/issues/172#issuecomment-353724264

    【讨论】:

    • 它对我有用。出于某种原因,我需要将此代码放在我的应用程序的 main.go 中,以便终端着色。在大多数 Windows 计算机上这不是必需的,但在某些计算机上是必需的。
    猜你喜欢
    • 2021-09-02
    • 2017-11-12
    • 2011-09-03
    • 2019-02-09
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2021-04-19
    • 2016-12-23
    相关资源
    最近更新 更多