`less` または `more` は ANSI エスケープ `\x1b[2K` (erase_line) をサポートしていますか?

`less` または `more` は ANSI エスケープ `\x1b[2K` (erase_line) をサポートしていますか?

基本的に、ターミナルをアニメーション化したいのですが、テキストが長すぎるため、ページャーが必要です。less でテキストの色を定期的に変更したいとします。可能ですか?

答え1

編集回答者フォンブランドそしてトーマス・ディッキー技術的にはより正確です。

lessオプションを使用すると、生の ANSI エスケープがサポートされます-r。また、インライン消去もサポートされます。

ただし、アニメーションは表示されません。例:

echo -e "foo\x1b[1G\x1b[2Kbar" > test.ansi
less -r test.ansi

のみ印刷されますbar

moreデフォルトでは ANSI エスケープを渡しますが、私がテストしたところによると行編集はサポートされていません。

参照lessmoreの違いに関するこのStackoverflowの回答most

答え2

行をクリアすることは、端末の色の変更とは間接的な関係しかありません。背景color を指定すると、多くの端末 (Linux コンソール、rxvt、xterm、およびこれらを模倣したプログラム) が、その色を使用して背景のクリアされた領域に色を付けます。

lessいくつかのクリア操作は使用しますが\x1b[2Kソース、termcapインターフェースを使用したいくつかの機能を使用します。最も関連のある部分は、用語情報(5)マニュアルページ:

   clr_bol                   el1    cb   Clear to beginning
                                         of line
   clr_eol                   el     ce   clear to end of line
                                         (P)

つまり、\x1b[Kおよび\x1b[Kはそれぞれ、el1および ですel。従来の termcap 機能 はなくel2、 (またはオプションlessを使用してファイルの内容をそのまま渡すように指示しない限り)は を送信しません。-r-Rless\x1b[2K

についても同様でありmore、例えば、util-linuxパッケージ: termcap の機能のみを使用します。とは異なりlessmore非表示文字を端末に直接送信するオプションはありません。

-rまたはオプションを使用する場合は、-Rless限定:lessそれらのエスケープが何をするのかは知らない(あるいはあまり気にしない)。マニュアルページ:

-rまたは--raw-control-chars
原因"生"表示される制御文字。デフォルトでは、キャレット表記を使用して制御文字が表示されます。たとえば、制御文字 A (8 進数 001) は "^A" として表示されます。 警告: -r オプションを使用すると、less できない画面の実際の表示を追跡します (これは、画面が各タイプの制御文字にどのように応答するかによって異なるため)。そのため、長い行が間違った場所で分割されるなど、さまざまな表示上の問題が発生する可能性があります。

答え3

エスケープ シーケンスに反応するのは通常 tty です (実行中のプログラムがエスケープ シーケンスを尊重しないように設定しない限り、その場合はプログラム自体がそうするかもしれません)。 は、more(1)かなり原始的な画面書き換え (画面の長さの行を書き出してキーが押されるのを待つだけで十分) を行うので、入力をそのまま渡すだけだと思います。 はless(1)バックアップする必要があるので、画面をより詳細に制御する必要があります。

関連情報