'less -F'をtermcap初期化と効果的に組み合わせることはできますか?

'less -F'をtermcap初期化と効果的に組み合わせることはできますか?

less -Fコンテンツが1画面に収まると、閉じる回数が減ります。しかし、termcap初期化を使用すると、つまり、いいえ使用すると、-Xファイルが画面に収まり、内容が少なく表示され、画面に合っていることを確認し、初期化解除中に画面を終了して消去するため、何も印刷されません。

これは次のように証明できます(空のLESS変数を想定)。

$ echo foo > new_file
$ cat new_file
foo
$ less -X -F new_file
foo
$ less -F new_file
$

マウスホイールでスクロールできるtermcap機能やその他の機能が気に入って絶対に使いたくありません-X。コンテンツが画面に収まると(そして基本的にそのように動作する場合cat)、シャットダウンを減らす方法もありますか? ?

ベストアンサー1

関連する抜粋は次のとおりです。less'よくあ​​る質問:

画面を変更せずに終了できますか?

less が開始されると "ti" termcap 文字列を端末に送信し、終了すると "te" 文字列を送信します。 "te"文字列の機能は、システム、端末の種類、およびtermcapのバージョンによって異なります。一部のシステムでは何も行いません。他の場合は、lessが開始されたときの状態に画面を復元し、lessが見ていたファイルの最後のページを画面から削除します。

システムで "te" の振る舞いが気に入らない場合は、-X オプションで less を呼び出して "ti" と "te" の文字列転送を無効にできます。残念ながら、 "ti" / "te"文字列は他の目的を果たす可能性があるため、これは時々他の副作用を引き起こします。たとえば、一部の端末では、「ti」と「te」を無効にすると、矢印キーの動作が停止します。

「te」に他の操作を実行させるには(たとえば、画面をまだ実行していない場合は復元する)、システム端末のtermcapまたはterminfoを変更する方法を理解する必要があります。残念ながら、これはシステムごとに異なるため、システムのマニュアルを確認する必要があります。

研究の結果、「ti」と「te」のtermcap関数は、terminfoで「smcup」と「rmcup」と命名され、これはより現代的なtermcapと同じです。

$TERM端末がどのように設定されているか(おそらく)確認できますxterm

infocmp -1  # which will print out capabilites one per line

次の助けを借りて、シーケンスの意味を解読できます。VT100制御文字リファレンス

端末から「smcup」および「rmcup」機能を削除する場合:

infocmp -1 | sed -r '/[sr]mcup.*/d' > new-terminfo-for-$TERM

次に、$ TERMの新しい基本機能仕様であることをterminfoライブラリに通知します。

tic new-terminfo-for-$TERM
# you reverse this with `rm -ri ~/.terminfo`

気づくでしょうless代替画面これ以上消去されません(入力されたことがないからです)。しかし、マウスはもう機能しません。

「rmcup」制御文字シーケンスで遊んで見つけたら教えてください!

修正する:

可能な代替案は、ファイルが端末の高さに合うときにcatを実行する関数でlessをラップすることです.bashrc):

less () {
    # When single file argument, and file small enough, cat it
    if [ $# = 1 ] && [ -f "$1" ] && [ $(wc -l "$1" | cut -d' ' -f1) -le $((${LINES:-0} - 3)) ]; then
        cat "$@"
    else
        command less "$@"
    fi
}

おすすめ記事