web-dev-qa-db-ja.com

gitlog- <number>はLESSenv変数との組み合わせでは機能しません

終了時にgit logまたはgit diffで画面をクリアしたい。 this の指示に従い、export LESS="FR"。bashrcに追加したので、gitはlessコマンドにXオプションを追加しないでください( pager config を参照)。 git logまたはgit log -10を実行すると、期待どおりに機能します。

しかし、git log -6(またはそれ以下)を実行するとすぐに何も出力されなくなります。その理由はquit-if-one-screenモードのようです。しかし、なぜこれが起こるのか理解できません。

1
naitsirch

tl; dr

なぜこれが起こるのか分かりません

lessなしのXは、代替画面を使用してその出力を表示します。 Fが原因ですぐに終了した場合、代替画面は非常に短時間(存在する場合)表示され、事実上、出力がまったくないかのように表示されます。


man 1 lessの関連フラグメント

(私のDebian 9で)

-Fまたは--quit-if-one-screen
ファイル全体を最初の画面に表示できる場合は、lessが自動的に終了します。

-Xまたは--no-init
termcapの初期化および非初期化文字列を端末に送信することを無効にします。これは、初期化解除文字列が画面のクリアなどの不要な処理を行う場合に望ましい場合があります。


予備メモ

  • 引用は、動作または「初期化および非初期化文字列」がTERM環境変数に依存することを明示的に述べていません。一般に、単純な読み取りやエコー以外の相互作用はTERMに依存すると想定するのが適切です。 lessの場合、それは依存します。例えばTERM=vt100を使用すると、Xオプションとその欠如の間に違いが見られない可能性が高く、「終了時に画面をクリアする」というリクエストは notは、「Xオプションをlessコマンドに追加しない」ことで解決されます。
  • 私のテストはTERM=screenで行われました。他の多くの端子タイプも同様に動作することを期待しています。あなたの問題はあなたの端末が私のように振る舞い、私の答えの残りが当てはまるからだと思います。
  • 以下のコマンドを逐語的に試すときは、端末が小さすぎたり大きすぎたりしないことを確認する必要があります。私のテストは30回線の端末で行われました。

ケース1:FXもありません

私がする時

seq 1 2 | LESS= less

または

seq 1 100 | LESS= less

FXも指定されていません。ツールは 代替画面 を使用します。これはman 1 xtermからです:

VTxxxモードでは、ウィンドウの表示領域と同じサイズの代替画面バッファーをアクティブ化および非アクティブ化するためのエスケープシーケンスがあります。有効にすると、現在の画面が保存され、別の画面に置き換えられます。ウィンドウの上部からスクロールされた行の保存は、通常の画面に戻るまで無効になります。

押す必要があります qlessを作成するには、別の画面を終了して終了します。代替画面から通常の画面に戻るという行為は、lessの出力を非表示にする責任があります。簡単です。出力は代替画面バッファーに存在しますが、通常の画面バッファーには存在しません。


ケース2:Xのみ

私がする時

seq 1 2 | LESS=X less
# equivalent to
seq 1 2 | LESS= less -X

または

seq 1 100 | LESS=X less
# equivalent to
seq 1 100 | LESS= less -X

ツールは、通常はバッファを切り替える「初期化および非初期化文字列」を端末に送信しません。すべての出力は通常の画面になります。それでも私は押す必要があります q 出る。


ケース3:両方のオプション、FX

私がする時

seq 1 2 | LESS=FX less
# equivalent to
seq 1 2 | LESS= less -FX

または

seq 1 100 | LESS=FX less
# equivalent to
seq 1 100 | LESS= less -FX

通常の画面も使用されます。十分な行数がない場合、ツールはヒットしたかのようにすぐに終了します q すぐに–これがFの仕組みです。ツールが終了した後も、常に表示される通常の画面であるため、出力は引き続き表示されます。

リンクした回答 Gitで使用されるデフォルトのオプションはFRSXであると述べています。 リンクした構成FRXを読み取ります(回答が公開された後に変更されましたか?または回答が最初から少し間違っていました)。とにかく、これがGitがデフォルトで使用するケースであることは間違いありません。


ケース4:Fのみ

私がする時

seq 1 2 | LESS=F less
# equivalent to
seq 1 2 | LESS= less -F

または

seq 1 100 | LESS=F less
# equivalent to
seq 1 100 | LESS= less -F

(最初のケースのように)代替画面が使用されますが、十分な行がない場合、lessはヒットしたかのようにすぐに終了します q すぐに(3番目の場合のように)。実際、行数が少ないと、通常の画面がすぐに表示されるため、出力がまったく表示されません。代替画面には気づきません。または、端末エミュレーターやビデオハードウェアがそもそもそれを表示しない場合もあります。モニターには、常に通常の画面が表示されます。出力は通常の画面バッファーに存在しません。これはあなたが経験していることです。


結論

そうです、ここではF(またはquit-if-one-screen)が重要です。 Xを削除する場合は、Fも削除する必要があります。注 リンクされた回答 これを行います:FRSXからRになります(Sは行の折り返しを担当し、問題とは関係ありません)。ドロップ両方。 「Xオプションのみを削除するだけで十分です」というコメントがあります。私のテストはコメントが間違っていることを示しています、それはあなたが経験した問題につながります。

1