如何让win32控制台识别ANSI / VT100转义序列?

时间:2013-05-26 00:25:31

标签: windows terminal console-application ncurses ansi-escape

我正在构建一个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;
}

Screenshot

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

13 个答案:

答案 0 :(得分:55)

[更新]有关最新的Windows 10,请阅读@ brainslugs83的有用贡献,就在下面的答案评论中。

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

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

Microsoft KB101875解释了如何在命令窗口中启用ANSI.SYS ,但它不适用于Windows NT 。根据文章:we all love colors,现代版本的Windows没有这种漂亮的ANSI支持。

相反,Microsoft创建了许多功能,但这远非您需要操作ANSI / VT100转义序列。

有关更详细的说明,请参阅Wikipedia article

  

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

     

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

所以我认为Jason Hood的 ANSICON 是你的解决方案。它是用C编写的,支持32位和64位版本的Windows,以及the source is available

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

答案 1 :(得分:36)

从Windows 10 TH2(v1511)开始,conhost.execmd.exe支持开箱即用的ANSI和VT100转义序列(尽管they have to be enabled)。

有关详细信息,请参阅my answer over at superuser

答案 2 :(得分:13)

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

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

答案 3 :(得分:10)

对于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

答案 4 :(得分:8)

如果ANSICON不可接受,因为它要求您在系统上安装某些东西,这是一个更轻量级的解决方案,可以将ANSI代码解析并转换为相关的Win32 API console functions,例如SetConsoleTextAttribute

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

答案 5 :(得分:5)

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

答案 6 :(得分:1)

也许ANSICON可以帮助你

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

使用以下内容安装:ansicon -i

答案 7 :(得分:1)

我个人喜欢clink。它不仅处理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编写脚本。
  •   
  • 彩色且可编写脚本的提示。
  •   
  • 自动应答“终止批处理作业?”提示。
  •   

答案 8 :(得分:1)

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

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

正确加载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?

在任何情况下,当您使用command.com的实际DOS版本时,ansi 在加载后启用:您可以使用这样的一些ansi艺术证明它的使用:

command /c type ansiart.ans

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

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

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

答案 9 :(得分:1)

在最新的win10中,可以通过public class PersonsController : AbpODataEntityController<Person>, ITransientDependency { public PersonsController(IRepository<Person> repository) : base(repository) { } [EnableQuery(MaxExpansionDepth = 10)] public override IQueryable<Person> Get() { return base.Get(); } } 完成。参见https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#example

答案 10 :(得分:0)

我发现此工具可以正常工作。 Microsoft Color Tool from GitHub

解压缩压缩文件,然后在具有管理权限的情况下打开CMD。

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

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

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

  • campbell.ini
  • campbell-legacy.ini
  • cmd-legacy.ini
  • deuternopia.itermcolors
  • OneHalfDark.itermcolors
  • OneHalfLight.itermcolors
  • solarized_dark.itermcolors
  • solarized_light.itermcolors

对于我来说,命令就像这样的“ colortool -b solarized_dark.itermcolors

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

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

Console Property

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

{{1}}