私はずっと前に、いくつかの同僚のシステムで「もっと」を模倣するためにlessコマンドをカスタマイズするのを見たことがあると確信しています。私が望むもの:
ファイルが短い場合(1画面未満)、catのように動作する必要があります。ファイルの内容を表示して終了します。
ファイルが1つの画面より長い場合は、通常どおり実行され、ユーザー入力を待ち、終了時に画面を消去し、前のコマンドを画面に残す必要があります。
-FXを減らして実験してみましたが、ファイルが大きいと画面に多くの内容が残ります。
答え1
私が正しく理解したら、大容量ファイルの代替画面切り替え動作を維持し、単一の画面に収まり、スクロールを必要としない小さなファイルに対してのみ-Xスイッチをオンにしたいと思います。
これは、ドキュメントで引用されたバージョン530のデフォルト動作ですless
。NEWS
ソースコード:
マイナーバージョン487と530の間の主な変更点
-F
使用とファイルが1画面に収まる場合は、端末初期化シーケンスを出力しないでください。
残念ながら、2019年現在の一部のディストリビューション(Debian 10など)はまだ古いバージョンを使用しているため、以前のバージョンless
から切り替えたくない場合源泉、唯一の解決策はラッパーを使用することです。
以下はそのようなラッパーの例です。既知の制限事項は次のとおりです。ㅏ):n
(:p
次/前のファイル)コマンドは機能しませんless
。コマンドラインのすべてのファイルが1つのストリームにリンクされています。雨)/usr/bin/awk
実際にはgawk
(GNU Awk)またはThomas Dickey以外の入力のNULLバイトを処理できません。首。
#! /usr/bin/awk -f
BEGIN { "tput lines" | getline max; max -= 2 }
{ l[NR]=$0 }
NR>=max {
for(i = 1; i <= NR; i++) print l[i] | "less";
while(getline > 0) print | "less";
}
END { if (NR < max) for(i = 1; i <= NR; i++) print l[i] | "less -FX" }
答え2
この問題を解決する簡単な方法はありません。
less
元の画面をきれいに保つために、代替画面を使用または使用しないことがあります-X
。
less
ページ全体を読んだ後、画面を再度インポートして代替画面を使用し始めることはできません。
less
正しいモードで起動してデータを送信する前に、少なくとも1ページまたはeofが読み取られるまで待つ必要があります。それは次のとおりです。
page_stdin() {
awk -v l="${LINES:=$(tput lines)}" '
cmd {print | cmd; next}
{lines = lines $0 ORS}
NR == l {cmd = "less"; printf "%s", lines | cmd}
END {if (!cmd) printf "%s", lines | "less -FX"}'
}
mypager() {
if [ "$#" -eq 0 ]; then
page_stdin
else
for file do page_stdin < "$file"; done
fi
}
(GNUを使用すると、最初に改行がない場合は末尾の改行を追加しないことでawk
置き換えることができます)。ORS
RT
cmd | mypager
ただし、これはコンテンツページ全体があるか、出力が完了するまでパイプされたコマンドの出力が表示されないことを意味します。 (たとえばとseq 200 | pv -qL40 | mypager
比較してみてくださいseq 200 | pv -qL40 | less
)。
それはあなたがそのようなものを使用しないと仮定しLESS=-s
、あなたがそれを持っていない場合は、画面より大きな行にだまされることに注意してくださいLESS=-S
。
答え3
これを端末に貼り付ける(またはbashrcに入れてください):
less_cat(){
[ "$(wc -l <"$1")" -ge "$LINES" ] && less "$1" || less -FX "$1"
}
これで、以下を実行できます。
less_cat /etc/fstab
less_cat /var/log/messages
それはあなたが望むものを正確にします。
メモ:このソリューションはBASH / ZSHと互換性があります(説明を参照)。
頑張ってください!