Escape-Characters

ANSI 轉義序列 ^[[K 由 less -R 但不是大多數處理

  • July 13, 2018

我正在編寫一個包裝器ack以在本地搜尋程式碼,並將一些額外的上下文行通過管道傳輸到尋呼機。

這是包裝腳本ackc。在不同的範例之間,我將改變傳遞ack--pager.

#!/bin/sh

ack -C 20 -i \
   --pager=most \
   --heading \
   --break \
   --color \
   --show-types \
   "$@"

使用less(沒有-R)作為尋呼機,幾乎所有的轉義序列都使用插入符號表示(不知道這叫什麼。^[是例外。它被渲染為ESC使用倒置的背景顏色(此處未複製顏色) .

這是輸出範例(由ackcwith--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不理解這個序列?我可以配置它以正確處理它嗎?

大多數的行為是硬編碼的。原始碼有幾個這樣的塊,用於在收到轉義字元後進行解析:

    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 顏色轉義序列。

所有的清理操作也都以轉義字元開頭,因此大多數人不會按照要求進行操作。

順便說一句,我看到戴維斯幾天前做了一個改變作為一種解決方法。最終這將是一個打包的版本……


作者:約翰·E·戴維斯 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 呼叫。

引用自:https://unix.stackexchange.com/questions/455208