web-dev-qa-db-ja.com

ANSIエスケープシーケンス^ [[Kはより少ない-Rで処理されますが、ほとんどではありません

ackのラッパーを作成して、ページャーにパイプされたコンテキストの追加行を使用してコードをローカルで検索します。

これがラッパースクリプトackcです。さまざまな例の間で、ackに渡されるものを_--pager_として変更します。

_#!/bin/sh

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

less(-Rなし)をポケットベルとして使用すると、ほとんどすべてのエスケープシーケンスがキャレット記法を使用してレンダリングされます(何と呼ばれるかわかりません。_^[_は例外です。レンダリングされます。 ESCとして、背景色が反転しています(色はここでは再現されていません)。

これが出力のサンプルです(ackcによって生成され、_--pager=less_とLESSLESSPIPEなどの環境変数がクリアされています)

_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
Gregory Nisbet

ほとんどの動作はハードコーディングされています。ソースコードには、エスケープ文字を受け取った後に解析するための次のようなチャンクがいくつかあります。

     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カラーエスケープシーケンスを探します。

すべてのクリア操作もエスケープ文字で始まるため、mostは要求された処理を実行しません。

ちなみに、回避策として、デイビスが数日前に変更を加えたようです。最終的にはパッケージバージョンになります...

 
作成者:John E. Davis 2018-07-11 06:26:02 
コミッター:John E. Davis 2018-07-11 06:26:02 
親:97befd7b984520e80475bb1cb857b35650755a15(5.1-20より前:ホーム/エンドキーのサポートを追加)
ブランチ:マスター、リモート/オリジン/マスター
フォロー:
前:
 
 pre5.1-21:の値に関係なく、行末までのエスケープシーケンス(ESC [K)を使用して出力を色付けしようとするプログラムの回避策を追加しました。 isatty(fileno(sdout))。
 
 + 21。 src/line.c:行末までのエスケープシーケンス(ESC [K)
 +を使用して、
 +出力を色付けしようとするプログラムの回避策を追加しました。 isatty(fileno(sdout))の値。ほとんどの場合
 +は、-v。
で呼び出されない限り、ESC [Kを無視します。]
3
Thomas Dickey