在 Windows 终端中启用 ANSI 序列

2024-03-11

我偶然发现一个有趣的问题 在 Windows 中:


C:\> lua
> print("\x1b[95mMagenta\x1b[0m")
-[95mMagenta-[0m

但如果我跑os.execute()即使使用空命令, 在此之前,它按预期工作:

C:\> lua
> os.system(""); print("\x1b[95mMagenta\x1b[0m")
Magenta

(最后一行用洋红色打印)

为什么会发生这种情况,以及如何使 ANSI 代码正常工作 不打电话os.execute()?


为了使 ANSI 代码在控制台中工作,您应该设置特定的ENABLE_VIRTUAL_TERMINAL_PROCESSING通过调用WinAPI函数进入模式SetConsoleMode.

当你调用os.execute()在Lua中,Lua调用C运行时函数system(),这会创建cmd.exe进程,它初始化所有的花里胡哨的东西。
但是 Lua 当然不知道 Windows 控制台功能;它仅适用于具有默认设置的控制台。


UPDATE:
这是如何从 LuaJIT 脚本打开 ANSI 转义序列的示例:

local ffi = require"ffi"
ffi.cdef[[
typedef int BOOL;
static const int INVALID_HANDLE_VALUE               = -1;
static const int STD_OUTPUT_HANDLE                  = -11;
static const int ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4;
intptr_t GetStdHandle(int nStdHandle);
BOOL GetConsoleMode(intptr_t hConsoleHandle, int* lpMode);
BOOL SetConsoleMode(intptr_t hConsoleHandle, int dwMode);
]]
local console_handle = ffi.C.GetStdHandle(ffi.C.STD_OUTPUT_HANDLE)
assert(console_handle ~= ffi.C.INVALID_HANDLE_VALUE)
local prev_console_mode = ffi.new"int[1]"
assert(ffi.C.GetConsoleMode(console_handle, prev_console_mode) ~= 0, "This script must be run from a console application")
local function turn_VT(on_off)
   assert(ffi.C.SetConsoleMode(console_handle, bit.bor(prev_console_mode[0], on_off and ffi.C.ENABLE_VIRTUAL_TERMINAL_PROCESSING or 0)) ~= 0)
end

print('\x1b[95mMagenta\x1b[m')
turn_VT(true)
print('\x1b[95mMagenta\x1b[m')
turn_VT(false)
print('\x1b[95mMagenta\x1b[m')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 终端中启用 ANSI 序列 的相关文章

随机推荐

  • 使用 Glide 预加载多个图像

    我们正在努力预加载图像到缓存内存中以便稍后加载它们 图像位于资产文件夹申请的 我们尝试过的 Glide with this load pictureUri diskCacheStrategy DiskCacheStrategy ALL Gl
  • 获取 Spring Security 中所有已登录的用户

    我想获取当前登录我的应用程序的所有用户的列表 我知道 我应该注射SessionRegistry在我的代码中调用getAllPrincipals 方法 不幸的是 我总是得到空列表 看起来SessionRegistry没有填充 我不知道如何制作
  • 那么 ASP.NET MVC 3 中是否内置了 [Email] 属性?

    The Email 属性将像在未来一样内置到 ASP NET MVC 3 中吗 那么现在可以用还是不能用呢 我想这是一个相当愚蠢的问题 但我花了一些时间谷歌搜索并没有找到任何正常的答案 电子邮件正则表达式 a z d u00A0 uD7FF
  • Fancybox 导航箭头未显示

    我是 jquery 的新手 所有动画 例如过渡和速度 都工作正常 但是 showNavArrows 和 循环 不起作用 这是代码 document ready function a single image fancybox transit
  • HTTP 状态 500 - java.lang.NoClassDefFoundError:无法初始化类 org.apache.jasper.el.E​​LContextImpl [重复]

    这个问题在这里已经有答案了 当我尝试在 myeclipse 上浏览 localhost 8080 时 出现以下错误 type Exception report message java lang NoClassDefFoundError C
  • 合并特定列上的两个大型数据框并显示进度条

    我有两个大型数据集 一个 2 6 GB 另一个 1GB 我已经设法将它们作为数据帧读取 接下来 我想要创建一个新的 DataFrame 在其中我想要将两个数据集的唯一 ID 进行匹配 并丢弃两个数据集之间没有匹配的 ID 的行 我尝试过合并
  • 如何使用 JSPM 导入带有 Typescript 声明的外部 NPM 模块

    test module 是用 Typescript 编写的外部模块 带有 index d ts 定义文件 它在 package json 中有 tsd tsc 的属性 typings dist index d ts 打字稿 定义 dist
  • Xcode gRPC-Core 错误:找不到“openssl_grpc/ssl.h”文件

    Xcode 11 2 1 Mac 10 15 2 测试版 Pod 版本 1 8 4 我试图Archive我的 Mac 应用程序在 Xcode 上 然后在我的 Xcode 中出现以下错误 我可以毫无问题地编译我的应用程序 只是无法存档 我想问
  • 在主模块中找不到库模块中的包

    我有一个从 Eclipse 导入到 Android Studio 的项目 在 Eclipse 中一切都运行良好 它包含一个主模块 Eclipse 中的项目 它使用库模块 Eclipse 中的库项目 中的包 由于迁移进展不顺利 我手动创建了一
  • package-info.java 包注释影响所有类,包括子包中的类

    我想在我的所有课程上应用注释 并且我正在尝试最好的方法来做到这一点 到目前为止 我坚持使用可以注释整个包的 package info java 文件 但不能注释子包中包含的类文件 除了在我的项目中添加 100 个仅包含单个注释的相同 pac
  • 应用什么算法来连续重新分配小内存块?

    在 C 程序中 我面临需要拥有大量内存块的事务 我需要知道是否有一种算法或最佳实践技术用于处理所有这些 malloc free 我使用数组来存储这些内存块 但在某些情况下指出数组本身已满并且重新分配数组只会更加浪费 处理这个问题的优雅方法是
  • 是否可以强制通过 Wifi 或 TMobile 网络进行网络流量?

    我想知道使用 G1 是否可以强制网络流量通过 Wifi 或通过 Cell GSM 网络 我需要强制应用程序通过塔式网络连接以获取一些登录信息 这可能吗 有人对这如何可能有任何想法吗 我正在尝试使用 Android SDK 在应用程序内完成此
  • D3 - 如何将圆包转换为椭圆包?

    如何利用D3圆形包布局以获得与此类似的图表 即使有更细长的椭圆 这种图表样式的关键应用是更容易放置标签 This is jsfiddle http jsfiddle net VividD WDCpq 8 这演示了我为其他目的制作的圆形包 但
  • Scala 2 将方法附加到类主体(元编程)

    我已经在这个问题上陷入了一周 但似乎没有任何进展 我正在尝试将一些方法和字段从一个类复制到另一个类 我有两个阶段参与其中 第一阶段扫描代码 找到需要复制的方法def 并保存对应的Tree 第二阶段将这棵树插入到需要的地方 为了简化这个问题
  • 在核心 ui vue.js 中的导航栏上仅在特定条件下显示特定项目

    嗨 我实际上对此很陌生 所以如果我问了一个明显的问题 我很抱歉 我实际上使用 vue js 和 coreui 制作了一个网站 问题是我在这个网站上有两种用户 管理员和联系人 我希望的是 当联系人登录时 导航栏中只能查看导航栏上的某些项目 我
  • 在生产系统中测试帐户和产品

    是否值得设计一个系统来期望测试帐户和产品在生产中存在并处于活动状态 或者是否应该不存在测试实体对生产数据库的污染 即使您的运输人员知道不运送任何寄给 测试客户 的盒子 我已经实现了在规范中具有 test True 属性的消息传递协议 并且想
  • getExtras().getSerialized() 和 getSerializedExtra() 之间的区别

    我很困惑 intent getSerializableExtra String name and intent getExtras getSerializable String key 我们可以互换使用它们吗 或者它们都有各自的特定场景 如
  • 如何强制cloudfront使用https(重定向http -> https)

    我通过 s3 cloudfront 在 aws 上托管一个静态站点 无论如何 我可以强制cloudfront将所有http请求重定向到https版本 强制 http gt https 转到cloudfront分布 选择分布 转到行为 选择一
  • crontab:正在运行 python 脚本但不执行操作系统命令

    我有这个 crontab 配置设置和以下脚本 MAILTO email protected cdn cgi l email protection 41 15 usr bin python home atweb Documents openg
  • 在 Windows 终端中启用 ANSI 序列

    我偶然发现一个有趣的问题 在 Windows 中 C gt lua gt print x1b 95mMagenta x1b 0m 95mMagenta 0m 但如果我跑os execute 即使使用空命令 在此之前 它按预期工作 C gt