78

我正在构建 ncurses 库的轻量级版本。到目前为止,它在兼容 VT100 的终端上运行良好,但 win32 控制台无法将\033代码识别为转义序列的开头:

# include <stdio.h>
# include "term.h"

int main(void) {
  puts(BOLD COLOR(FG, RED) "Bold text" NOT_BOLD " is cool!" CLEAR);
  return 0;
}

截屏

为了加载 ANSI.SYS 驱动程序并识别 ANSI/VT100 转义序列,需要在 C 代码级别做什么?

4

13 回答 13

75

[更新] 对于最新的 Windows 10,请阅读@brainslugs83 的有用贡献,就在此答案的评论下方。

而对于之前的版本Windows 10 Anniversary Update

ANSI.SYS 有一个限制,它只能在 Windows 95-Vista 下的 MS-DOS 子系统的上下文中运行。

Microsoft KB101875 解释了如何在命令窗口中启用 ANSI.SYS,但它不适用于 Windows NT。根据文章:我们都喜欢颜色,现代版本的 Windows 没有这种很好的 ANSI 支持。

取而代之的是,微软创建了很多函数,但这远不是你需要操作 ANSI/VT100 转义序列的。

有关更详细的解释,请参阅Wikipedia 文章

ANSI.SYS 也适用于 NT 派生系统,用于在 NTVDM 下执行的 16 位遗留程序。

Win32 控制台根本不支持 ANSI 转义序列。然而,诸如Ansicon 之类的软件可以充当标准 Win32 控制台的包装器,并添加对 ANSI 转义序列的支持。

所以我认为Jason Hood 的ANSICON 是您的解决方案。它是用C编写的,支持 32 位和 64 位版本的 Windows,源代码可用

我还发现了一些其他类似的问题或帖子,最终使用 ANSICON 得到了回答:

于 2013-05-28T18:43:07.947 回答
42

从 Windows 10 TH2 (v1511) 开始,开箱即用地支持 ANSIconhost.execmd.exeVT100 转义序列(尽管必须启用它们)。

有关更多详细信息,请参阅我在超级用户处的回答

于 2016-03-08T10:33:02.443 回答
17

从 Windows 10 开始,您可以使用ENABLE_VIRTUAL_TERMINAL_PROCESSING来启用 ANSI 转义序列:

https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx

于 2016-06-13T07:04:45.160 回答
17

对于 Python 2.7,以下脚本适用于 Windows 10 (v1607)

import os

print '\033[35m'+'color-test'+'\033[39m'+" test end"
os.system('') #enable VT100 Escape Sequence for WINDOWS 10 Ver. 1607
print '\033[35m'+'color-test'+'\033[39m'+" test end"

结果应该是:

[35mcolor-test[39m test end

color-test test end
于 2016-09-24T09:59:47.330 回答
16

基于@BrainSlugs83,您可以使用以下命令行在当前的 Windows 10 版本上通过注册激活:

REG ADD HKCU\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1
于 2019-05-15T13:24:20.883 回答
12

如果 ANSICON 不可接受,因为它要求您在系统上安装某些东西,则可以使用更轻量级的解决方案,将 ANSI 代码解析并转换为相关的Win32 API 控制台函数,例如SetConsoleTextAttribute

https://github.com/mattn/ansicolor-w32.c

于 2015-03-03T16:21:06.297 回答
8

要为您需要的 cmd 着色Windows.h并使用SetConsoleTextAttribute()更多详细信息,请参见http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047%28v=vs.85%29.aspx

于 2013-05-26T01:40:15.930 回答
5

在最新的win10中,可以通过SetConsoleMode(originMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING). 请参阅https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#example

于 2018-08-10T01:35:11.010 回答
4

也许ANSICON可以帮助你

只需下载并提取文件,具体取决于您的 Windows 操作系统:32 位或 64 位

安装它:ansicon -i

于 2016-12-14T14:40:46.857 回答
2

我个人喜欢叮当。它不仅处理 ANSI 代码,还添加了许多其他功能,因此 Windows 控制台的行为类似于bash(历史、反向历史搜索、键盘快捷键等):

  • 与 Bash 相同的行编辑(来自 GNU 的 Readline 库)。
  • 会话之间的历史持久性。
  • 上下文相关的完成;
    • 可执行文件(和别名)。
    • 目录命令。
    • 环境变量
    • 第三方工具;Git、Mercurial、SVN、Go 和 P4。
  • 新的键盘快捷键;
    • 从剪贴板粘贴 ( Ctrl-V )。
    • 增量历史搜索 ( Ctrl-R/Ctrl-S )。
    • 强大的补全(TAB)。
    • 撤消 ( Ctrl-Z )。
    • 自动“cd ..”(Ctrl-PgUp)。
    • 环境变量扩展 ( Ctrl-Alt-E )。
    • (按Alt-H了解更多...)
  • 使用 Lua 编写脚本完成。
  • 彩色和可编写脚本的提示。
  • 自动回答“终止批处理作业? ”提示。
于 2018-02-20T13:31:36.640 回答
2

Ansi.sys(在 system32 文件夹中)是作为 Windows XP、2000 和早期版本 NT 的一部分提供的“MSDOS 驱动程序”。在 2000 和 XP 中,它位于 system32 文件夹中(我不记得 NT 早期版本的结构)。在 DOS 子系统中运行并使用标准输出的程序可以像在 MSDOS 上运行一样使用 ANSI.SYS。

要加载 ansi.sys,您必须在配置中使用 device= 或 devicehigh= 命令,就像在 MSDOS 中一样。在 Windows NT 5 (2K & XP) 上,每个 DOS 子系统副本都可以在 pif/快捷方式中指定一个单独的配置文件(使用“高级”按钮),并且有一个名为 CONFIG.NT 的默认文件(也在system32 文件夹),如果 pif/shortcut 未指定特殊配置文件,则使用该文件夹。

正确加载 ansi.sys 后,mem /d 会报告它已加载。在早期版本的 NT 上,您可以而且必须加载适当的 DOS 环境来加载 ansi.sys,并且 ansi art 将在提示符下工作。在 Win 2K 和 XP 上,加载 ansi.sys 不会对您的“CMD 提示符”产生影响,因为 CMD 不是 DOS 程序:它是 32 位 Windows 控制台程序。由于某种我不明白的原因,在WinXP上,即使您使用“command.com /p”加载command.com的固定副本,命令提示符也不会启用ansi:也许当您这样做时,它只是模拟加载 command.com?

在任何情况下,当您使用实际的 DOS 版本的 command.com 时,加载后启用 ansi:您可以通过一些 ansi 艺术来演示它的使用,如下所示:

command /c type ansiart.ans

(这里是一个例子:http ://artscene.textfiles.com/ansi/artwork/beastie.ans )

CONFIG.NT(在 system32 文件夹中)包含加载设备驱动程序的语法示例。您需要成为管理员才能编辑该默认文件,或者您可以复制它。

在 Win 2K 和 XP 上,MSDOS 的默认“快捷方式”是 .PIF 文件,而不是 .LNK 文件。如果你为 CMD 创建一个 .lnk 文件,你将无法设置特殊的配置和 autoexec 文件,它将使用默认的 CONFIG.NT。如果您只想为一个 DOS 应用程序使用特殊的配置文件,您可以复制“MSDOS 快捷方式”,或者您可以复制 Windows 文件夹中的“_default.pif”。

于 2018-03-22T02:52:02.627 回答
2

有同样的问题。我安装了ConEmu,那个解决了我的问题。

于 2019-01-26T16:30:58.193 回答
1

我发现这个工具对我有用。 来自 GitHub 的 Microsoft 颜色工具

解压缩压缩文件,然后使用管理员权限打开 CMD。

转到您在 CMD 中解压缩文件的文件夹。

然后执行这个命令“ colortool -b scheme-name

方案名称需要替换为以下任何选项:

  • 坎贝尔.ini
  • 坎贝尔-legacy.ini
  • cmd-legacy.ini
  • deuternopia.itermcolors
  • OneHalfDark.itermcolors
  • OneHalfLight.itermcolors
  • solarized_dark.itermcolors
  • solarized_light.itermcolors

在我的情况下,命令将是这样的“ colortool -b solarized_dark.itermcolors

在控制台窗口上单击鼠标右键,然后选择“属性”。

您无需更改任何值,只需单击“确定”即可保存设置。(您会注意到您的字体已经包含颜色)。

控制台属性

然后重新启动您的 cmd 或 powerShell。

应该启用 ANSI 颜色并使用您之前选择的颜色方案。

于 2018-07-26T13:33:47.420 回答