回答:
この動作は、一部の(ハードウェア)ターミナルおよびほとんどの(ソフトウェア)ターミナルエミュレータに含まれる「代替画面」機能に起因しています。何が起こるかというと、一部の端末対応プログラムは、作業を行うために代替の「画面」に切り替わり、終了(終了、中断など)すると通常の「画面」に戻ります。これにより、そのようなプログラムの最終出力が効果的に消去されます。
「terminfo prevent altscreen」のWeb検索では、代替画面の「問題」といくつかの解決策を説明するページが提供されました。
リンクされたページで説明されているように、一部のプログラムは、代替画面を使用しないように構成できます。lessの-X
オプションは、これを行う間接的な方法です。Vimは、変数と変数を設定解除することで同様に設定できます。t_ti
t_te
より広い範囲の解決策は、端末のterminfoエントリを編集して、代替画面制御シーケンスが含まれないようにすることです。terminfoエントリは、特定の効果(カーソルの移動、画面のクリア、現在の行の一部の消去など)を作成するために端末に送信するシーケンスをプログラムに伝えるデータベースを形成します。端末が使用するterminfoエントリを編集することにより、「代替画面」制御シーケンスが存在することをすべてのterminfo使用プログラムに「無視」するように手配できます。
以下からの制御シーケンスのリストのxterm、我々は(のための関心の制御シーケンスことがわかりますxtermの端末エミュレータ様)があります
ESC [ ? 47 h
同様に1047と1049)、およびESC [ ? 47 l
(1047および1049の場合も同様)。これらのコードは、terminfo変数smcup
およびrmcup
。現在のTERMでこれらの変数を削除するための迅速で汚い方法は、次のようになります。
infocmp | sed -e 's/[sr]mcup=[^,]*,//' > /tmp/noaltscreen-terminfo
tic -o ~/.terminfo/ /tmp/noaltscreen-terminfo
この方法は非常に粗雑で、すべての端末で確実に機能するわけではありませんが、ほとんどのxtermのような端末エミュレーターでおそらく機能します。理想的には、端末のterminfoエントリのsmcup
とrmcup
変数の値を調査し、望ましくない動作を防ぐために控えめに編集する必要があります。上記のリンクされたディスカッション/ソリューションページには、自分でハッキングする代わりに使用できる「事前に作成された」terminfoファイルがあります(しかし、それで楽しいのは何ですか?)。
あなたは、設定する必要があります$MANPAGER
への/usr/bin/less -isX
パス交換、less
必要に応じて発見されました。重要な部分は-X
;です。これ-is
は、lessに渡されるデフォルトセットです。
ページャーがless
であると仮定して、環境変数LESS
に「X」を含めるように設定します。たとえば、私のものは:
LESS="-iMFXRj4a"
これを~/.bashrc
ファイルに設定できます
export LESS="-X"
他のオプションを含めたり、好きなオプションを追加したりできます。
別のトリック-他の答えよりもエレガントではありません-は:
man what | more
(少なくとも、これはMacOS Xで機能します。通常、MacOS Xは有効であるために十分に似ています。)