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
がこのシーケンスを理解しない理由はありますか?正しく処理するように構成できますか?
ほとんどの動作はハードコーディングされています。ソースコードには、エスケープ文字を受け取った後に解析するための次のようなチャンクがいくつかあります。
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を無視します。]