Escape-Characters
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
with--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 呼叫。