ANSI 转义序列 ^[[K 由 less -R 但不是大多数处理

ANSI 转义序列 ^[[K 由 less -R 但不是大多数处理

我正在编写一个包装器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 调用。

相关内容