less --quit-if-one-screen --no-initなし


31

終了後に以前の表示を復元するためにless、vimなどによって使用される代替画面をサポートする端末を使用しています。これは素晴らしい機能ですが、その場合、代替画面への切り替えが少なくなり、そのデータを表示し、画面が1つしかないことを認識して終了し、代替画面の内容を取得して終了するため、--quit-if-one-screen切り替えを実際に中断lessします。

一般的に推奨される回避策は--no-init、代替画面をまったく使用しないようにスイッチを使用することです。ただし、実際にはページャーとして機能しない場合に使用たいので、これはややいです。したがって、lessが自動的に終了しない場合にのみ代替画面を使用するソリューションを探しています。

これは主にGitのページャーとして使用するため、十分な出力がある場合にのみ実行するラッパーシェルスクリプトも問題ありません。少なくとも、それなしでそれを行う方法がない場合。


この場合の@thieMasterは、代替画面をどのように定義しますか?私はいくつかのタグをきれいにしようと、私は本当にここの意味を取得しない
Kiwy

回答:


14

less 530(2017年12月にリリースされた)以降、less --quit-if-one-screen1画面に満たない場合は代替画面に切り替えません。したがって、lessのバージョンが十分に新しい場合、この問題は発生しません。

以前のバージョンでは、起動時に代替画面を使用するかどうかを決定する必要はありません。終了するまでその選択を延期することはできません。

lessを呼び出して、代替画面を使用させ、lessが自動的に終了する場合は、コンテンツをプライマリ画面に表示できます。ただし、自動終了を検出する方法がわかりません。

一方、短い入力に対してcatを呼び出し、大きな入力に対してlessを呼び出すことはそれほど難しくありません。さらに、バッファリングを保持しているので、入力全体が少ないものを見るのを待つ必要はありません(バッファはわずかに大きく、少なくとも1画面分のデータが表示されるまで何も表示されませんが、それ以上は表示されません)。

#!/bin/sh
n=3  # number of screen lines that should remain visible in addition to the content
lines=
newline='
'
case $LINES in
  ''|*[!0-9]*) exec less;;
esac
while [ $n -lt $LINES ] && IFS= read -r line; do
  lines="$lines$newline$line"
done
if [ $n -eq $LINES ]; then
  { printf %s "$lines"; exec cat; } | exec less
else
  printf %s "$lines"
fi

メイン画面に表示される行を表示し、その行でスクロールが発生する場合は代替画面に切り替えることをお勧めします。

#!/bin/sh
n=3  # number of screen lines that should remain visible in addition to the content
beginning=
newline='
'
# If we can't determine the terminal height, execute less directly
[ -n "$LINES" ] || LINES=$(tput lines) 2>/dev/null
case $LINES in
  ''|*[!0-9]*) exec less "$@";;
esac
# Read and display enough lines to fill most of the terminal
while [ $n -lt $LINES ] && IFS= read -r line; do
  beginning="$beginning$newline$line"
  printf '%s\n' -- "$line"
  n=$((n + 1))
done
# If the input is longer, run the pager
if [ $n -eq $LINES ]; then
  { printf %s "$beginning"; exec cat; } | exec less "$@"
fi

5
「起動時に代替画面を使用するかどうかを決定する必要があります。その選択を終了時まで延期することはできません。」-明らかにそれはしませんが、X行を受信するまで出力(端末初期化コマンドや実際のデータなど)を単に延期することはできませんでした。STDINが排出される場合にはX <TERMINAL_LINESそれは単にそれ以外の場合は、代替画面を初期化し、行うことになっているものだろう、stdoutと終了時にすべてをダンプするだろうが
ThiefMaster

1
:私はあなたの最初のコード例の修正バージョン使用して終了gist.github.com/ThiefMaster/8331024(のgit -ページャとして呼び出されたとき$ LINESが空だったと私はあなたがインクリメント忘れてしまったと思う$n
ThiefMaster

@ThiefMasterフィードバックをありがとう。#!/bin/bashスクリプトはbash以外のシステム(Ubuntuなど)では機能しないため、bash固有の構成を使用しているため、スクリプトを配置する必要があります/bin/sh
ジル「SO-悪であるのをやめる」14年

3
私は本当にこのアイデアを好きで、(より多くの機能を持つ)ビットさらにそれを開発:github.com/stefanheule/smartless
ステファン・

1
@ThiefMaster:un-init文字列を送信したless、画面の現在の内容を印刷する場所を終了するオプションの方法もあります(ただし、ありません)。したがって、スクロールバックを乱雑にすることなく代替画面の利点を得ることができますが、マンページの関連部分または終了後も端末に何でも残します。
ピーターコーデス

9

GNU less v。530には@ paul-antoine-arrasによって参照されるFedora-patchが組み込ま--quit-if-one-screenれており、使用時に入力が1つの画面に収まる場合に端末初期化シーケンスを出力しなくなります。


4
マックOS上の自作ユーザーが実行することで、すぐにこの動作を得ることができるbrew install less、と確認することは、$LESSFおよび省いX.あり
ライアン・パターソン

これは私のお気に入りの答えです。すぐにGNUからLess 5.3.0をダウンロードし、自分でコンパイルしました。素晴らしいヒント!
iBug

5

のような遅い入力の場合、次のようgit log -Gregexにしますか?

A)メイン画面に表示される行を表示し、スクロールが必要になったら代替画面に切り替えます(したがって、最初$LINESの出力が常にスクロールバックに表示されます)。その場合は、Gillesの回答の 2番目に進みます

B)代替画面に表示される行。ただし、スクロールが不要であることが判明した場合、代替画面を終了し、メイン画面に行を印刷します(スクロールが必要な場合、スクロールバックに出力は表示されません)。その場合、以下のスクリプトを使用します。

これはteeその後、一度、一時ファイルへの入力だlessから出るそれはcatそれは画面の高さよりも少ない行が含まれている場合は、一時ファイル(S)

#!/bin/bash

# Needed so less doesn't prevent trap from working.
set -m
# Keeps this script alive when Ctrl+C is pressed in less,
# so we still cat and rm $TMPFILE afterwards.
trap '' EXIT

TXTFILE=$(mktemp 2>/dev/null || mktemp -t 'tmp')

tee "$TXTFILE" | LESS=-FR command less "$@"

[[ -n $LINES ]] || LINES=$(tput lines)
[[ -n $COLUMNS ]] || COLUMNS=$(tput cols)
# Wrap lines before counting, unless you pass --chop-long-lines to less
# (the perl regex strips ANSI escapes).
if (( $(perl -pe 's/\e\[?.*?[\@-~]//g' "$TXTFILE" | fold -w "$COLUMNS" | wc -l) < $LINES )); then
    cat "$TXTFILE"
fi

rm "$TXTFILE"

で使用しexport PAGER='/path/to/script'ます。git既にオーバーライドしていない限り、これで十分ですcore.pager

可能な拡張機能については、https//github.com/johnmellor/scripts/blob/master/bin/leastにあるこのスクリプトのもう少し具体的なバージョンも参照してください。


3

これは、lessソースコードの-Fオプションの動作を変更することにより、Red Hatベースのディストリビューションで長い間解決されてきました。FedoraProjectのこのパッチを参照してください。端末(一度に表示できる最大行数)およびファイルが1つの画面に収まる場合の初期化および初期化解除シーケンスを省略します。したがって、ファイルの長さに関係なく、-Xオプションと-Fを一貫して使用する必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.