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

すべての消去操作もエスケープ文字で始まるので、最大要求された操作を実行しません。

ところで、数日前にDavisが解決策に変更したのを見ました。結局、これはパッケージ版になります...

寄稿者: ジョン・デイビス 2018-07-11 06:26:02
提出者:ジョンE.デイビス2018-07-11 06:26:02
親:97befd7b984520e80475bb1cb857b35650755a15(5.1-20より前:Home / Endキーのサポートを追加)
分岐:マスター、リモート/ソース/マスター
次のように:
プレフィックス:

    pre5.1-21:isatty(fileno(sdout))値に関係なく、行末エスケープシーケンス(ESC [K))を使用して出力色を指定したいプログラムの回避策が追加されました。

+21。 src/line.c: カラーリングを試みるプログラムの回避策を追加
+行末エスケープシーケンス(ESC [K)の明確な出力を使用する
+ isatty(fileno(sdout)) 値は考慮されません。ほとんどの人はそうです
+ -vで呼び出さない限り、ESC [Kを無視します。

おすすめ記事