如何通过terminfo获取仅重置终端前景/背景色的控制序列
问题描述
在终端中使用ANSI序列Esc[39m可以清除前景色设置,同时不会修改粗体、下划线或背景色等其他属性,示例如下:
echo -e "\e[31;1mRed and bold.\e[39m Bold only."
我希望从terminfo功能项中获取这个序列,但一直没有找到对应的项;尝试使用setaf 9时,它返回的序列是Esc[91m,会切换到亮色:
$ tput setaf 1 | xxd 00000000: 1b5b 3331 6d .[31m $ tput setaf 9 | xxd 00000000: 1b5b 3931 6d .[91m
目前我找到的唯一可重置前景色的terminfo功能项是sgr0,但它会同时重置所有其他终端属性。
请问能否通过terminfo访问以下两个控制序列?
- 默认前景色对应
Esc[39m; - 默认背景色对应
Esc[49m;
回答
可以获取,有两种常用方案:
方案1:使用新版terminfo新增的能力项
ncurses-terminfo 6.1+ 版本已经新增了两个专属能力项来匹配这两个控制序列:
setaf_default:对应\e[39m,仅重置前景色为系统默认值,不修改其他属性setab_default:对应\e[49m,仅重置背景色为系统默认值,不修改其他属性
你可以直接用tput调用,示例:
# 输出红色粗体文本后重置前景色,保留粗体属性 echo -e "$(tput setaf 1)$(tput bold)红色粗体文本$(tput setaf_default) 仅保留粗体属性的文本"
如果你的系统termcap/terminfo版本太旧没有这两个能力,可以用第二种方案。
方案2:自定义terminfo能力项
如果本地terminfo数据库没有上述两个能力,你可以手动添加到当前终端的terminfo条目中:
- 导出当前终端的terminfo配置:
infocmp $TERM > my_custom.ti
- 编辑
my_custom.ti,在能力列表末尾新增两行:
setaf_default=\E[39m, setab_default=\E[49m,
- 重新编译导入配置:
tic my_custom.ti
导入完成后就可以正常调用这两个能力了。
注意不要使用op(重置默认颜色对)能力,这个能力会同时重置前景和背景色,无法满足仅修改单种颜色的需求;也不要用sgr0,它会重置所有终端属性,包括粗体、下划线等你想保留的设置。
内容的提问来源于stack exchange,提问作者yolenoyer
相关产品推荐
相关产品推荐

