可以使Terminal.app遵守ANSI转义码吗?

 向日葵一样2502932413 发布于 2022-12-21 08:54

我注意到,与TERM设置为环境变量xterm或者xterm-256color是Mac OS X的Terminal.app实用尊重大多数ANSI转义码,当为至少那些转义代码涉及到更改文本颜色.

例如:

echo -e "\033[0;31mERROR:\033[0m It worked"

生产:

截图

但是,我对ANSI转义码提供的光标位置操作功能更感兴趣.不幸的是,这种类型的代码在Terminal.app中似乎没有太好用,我已经能够收集到了.例如,我想要做的是这样的事情:

echo -e "\033[sHello world\033[uG'day"

ESC[s保存当前光标位置,同时ESC[u恢复上次保存的位置.由于运行上面的脚本,我希望"G'day"中的五个字符在重新定位光标后覆盖"Hello"的五个字符,产生以下结果:

G'day world

实际上,这正是我用iTerm2.app,ConEmu for Windows(运行MinGW或MSYS Git的bash.exe副本)等所得到的.然而,我在Terminal.app中看到的是:

Hello worldG'day

有没有理由这样做,除了Terminal.app之外,只是缺乏对这些代码的支持?有没有办法启用此功能?我有可能有错误配置的东西吗?我的TERM设置?别的什么?

我一直在各处搜索,但没有发现任何与Terminal.app相关的内容.我觉得很奇怪它会通过ANSI转义码支持彩色文本,但不会通过完全相同的技术重新定位光标.这似乎是一个相当明确的标准的相当随意的子集.这就是让我觉得我有一些错误配置的东西,而不是说Terminal.app是应该责备的......但是,我认为它可能根本无法完成.(可能是iTerm2首先存在的原因之一?)

如果有人能对这种情况有所了解,我们将不胜感激!

UPDATE

所以,我做了一些阅读和实验,并发现了以下奇怪之处:

在查看下面的nm答案之后,我决定将返回的字节写出来,tput以查看它们与常规ANSI指令的不同之处.

$ echo "$(tput sc)Hello world$(tput rc)G'day" > out.bin
$ cat -e out.bin
^[7Hello world^[8G'day$

看起来一切正常,如果我把它的序列ESC 7ESC 8,但如果我把它ESC [sESC [u分别,这是我理解的事情是ANSI SCP和RCP代码(保存光标位置较典型的代表性和还原光标位置, ).由于输入ASCII十进制字符78在转义的八进制字节表示旁边是不可能的(\0337!= ESC),因此可以使用环境变量来避免依赖tput:

$ esc=$'\033'
$ csi="${esc}["
$ echo "${csi}0;31mERROR:${csi}0m It worked."
ERROR: It worked.  # Color works, as before
$ echo "${csi}sHello world${csi}uG'day"
Hello worldG'day   # No dice
$ echo "${esc}7Hello world${esc}8G'day"
G'day world        # Success

我不确定为什么会这样.如果ESC 7并且ESC 8是ANSI SCP和RCP的某种专有或自定义代码,有可能从终端实现到终端实现不同,它会向我解释为什么tput首先创建.

不幸的是,我无法tput用于我目前的工作,因为我不是专门在bash环境中工作.我更好奇的是如何从终端到终端解释原始字节,更具体地说,是否有办法让Terminal.app遵守我试过的所有其他终端仿真器的相同ANSI转义码似乎没有问题.那可能吗?在这一点上,我开始认为它可能不是,这很好,但是肯定地知道并且可能还要了解其原因会很好.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有