![ANSI 转义序列 ^[[K 由 less -R 但不是大多数处理](https://linux22.com/image/136820/ANSI%20%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97%20%5E%5B%5BK%20%E7%94%B1%20less%20-R%20%E4%BD%86%E4%B8%8D%E6%98%AF%E5%A4%A7%E5%A4%9A%E6%95%B0%E5%A4%84%E7%90%86.png)
我正在编写一个包装器ack
来在本地搜索代码,并将一些额外的上下文行通过管道传送到寻呼机。
这是包装脚本ackc
。在不同的示例之间,我将改变传递ack
给--pager
.
#!/bin/sh
ack -C 20 -i \
--pager=most \
--heading \
--break \
--color \
--show-types \
"$@"
使用less
(没有 -R)作为寻呼机,几乎所有的转义序列都使用插入符号表示(不知道那叫什么。^[
是例外。它被渲染为ESC
反转的背景颜色(此处未再现的颜色) 。
这是输出的示例(由ackc
清除--pager=less
的环境变量(例如LESS
等)生成LESSPIPE
)
ESC[1;32m.local/lib/python2.7/site-packages/markupsafe/_speedups.cESC[0m
...
ESC[1;33m19ESC[0m:#define PY_SSIZE_T_MAX ESC[30;43mINTESC[0m_MAXESC[0mESC[K
ESC[1;33m20ESC[0m:#define PY_SSIZE_T_MIN ESC[30;43mINTESC[0m_MINESC[0mESC[K
这里重要的转义序列是^[[K
包含突出显示项目的每行末尾的序列。它由 适当处理less -R
。
.local/lib/python2.7/site-packages/markupsafe/_speedups.c
...
19:#define PY_SSIZE_T_MAX INT_MAX
20:#define PY_SSIZE_T_MIN INT_MIN
most
不过,似乎处理得不太好。
.local/lib/python2.7/site-packages/markupsafe/_speedups.c
1-/**
...
19:#define PY_SSIZE_T_MAX INT_MAX^[[K
20:#define PY_SSIZE_T_MIN INT_MIN^[[K
^[[K
它按原样通过序列。
这个序列是CSI (n) K -- EL -- Erase in Line
.当没有给出参数时,它会擦除到行尾。如果匹配的术语出现在行尾,可能需要这样做来清除背景颜色的杂散位。
有没有理由most
不理解这个顺序?我可以配置它以正确处理它吗?
答案1
大多数行为是硬编码的。源代码有几个这样的块,用于在收到转义字符后进行解析:
if ((ch == 033) && (Most_V_Opt == 0))
{
while ((ch == 033)
&& (0 == most_parse_color_escape (&b, e, NULL))
&& (b < e))
ch = *b++;
}
基本上它表示是否找到转义字符(033
)和-V
选项未设置,然后查找 ANSI 颜色转义序列。
所有清除操作也以转义字符开始,因此最多不会按照要求去做。
顺便说一句,我看到戴维斯几天前做出了改变作为解决方法。最终这将是一个打包版本......
作者:约翰·戴维斯 2018-07-11 06:26:02 提交者:John E. Davis 2018-07-11 06:26:02 父级:97befd7b984520e80475bb1cb857b35650755a15(pre5.1-20:添加了对 Home/End 键的支持) 分支:master、remotes/origin/master 如下: 前置: pre5.1-21:为尝试使用清除到行尾转义序列 (ESC[K) 的输出着色的程序添加了解决方法,而不考虑 isatty(fileno(sdout)) 的值。 +21。 src/line.c:为尝试着色的程序添加了解决方法 + 使用清除到行尾转义序列的输出 (ESC[K) + 不考虑 isatty(fileno(sdout)) 的值。大多数人都会 + 忽略 ESC[K,除非使用 -v 调用。