端末で画面の復元を設定するにはどうすればよいですか?


10

端末/環境に応じて、次のシーケンスは異なる効果をもたらします:

$ ls
1
2
$ man ls
enter q

現在のプロンプトの上に最後に表示されたマンページ画面が表示されるか、ls出力と以前のシェル出力が復元されます。vimシェルで何かを行うために使用してから一時停止する場合など、同じ効果が観察されます。

Fedora 19では、画面のデフォルトはno-restoreのようですが、gnome-terminal / xtermはデフォルトでdo-restoreを使用します。

Solarisでは、使用されているterminal / terminfo dbによって異なります。

異なるシステム/端末間で一貫して復元動作を構成したい。


常にGNU画面を実行している場合、一貫した動作が得られます。
ヨルダン2013

回答:


16

この機能は「代替画面」または通常画面と代替画面の切り替えと呼ばれているようです。

xtermを使用して調査できます。たとえばman man、「xtermman」と入力して終了します。これで、Ctrl+ Mouse2(中央クリック)-> [代替画面を表示]で代替画面に切り替えることができます。あるいは、xterm制御シーケンスを直接入力することもできます。例:

$ echo -e '\033[?47h' # alternate screen
$ echo -e '\033[?47l' # normal screen

最後の2つのコマンドは、gnome-terminalでも機能します(おそらく他のコマンドでも機能します)。

何が起きたときにman/ vi/ lessなどのスタートアップが、彼らは抽象的な画面クリアコマンドを送信し、基本的です。終了(または一時停止)時に、抽象的なrestore-screenコマンドを送信します。コマンドが具体的な端末制御シーケンスにどのように変換されるかは、terminfoデータベースで定義されています。

代替画面切り替えを無効にする

すべての端末で機能するのは、ローカルのterminfoエントリを調整することです。つまり、抽象的なクリア/復元画面コマンドのマッピングを削除します。

あなたはこれをこのように行うことができます-現在の$TERMエントリに対して(例えばFedora 19のgnome-terminalに対して):

$ echo $TERM
xterm-256color
$ infocmp -1 > xterm-256color
$ sed 's/^\(xterm-256color\)|/\1-na|/ ; /smcup\|rmcup/d ' \
    xterm-256color > xterm-256color-na
$ diff -u xterm-256color* 
--- xterm-256color  2013-08-04 16:33:52.041393461 +0200
+++ xterm-256color-na   2013-08-04 16:36:56.829930520 +0200
@@ -1,5 +1,5 @@
 #  Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm-256color
-xterm-256color|xterm with 256 colors,
+xterm-256color-na|xterm with 256 colors,
    am,
    bce,
    ccc,
@@ -155,7 +155,6 @@
    rin=\E[%p1%dT,
    rmacs=\E(B,
    rmam=\E[?7l,
-   rmcup=\E[?1049l,
    rmir=\E[4l,
    rmkx=\E[?1l\E>,
    rmm=\E[?1034l,
@@ -170,7 +169,6 @@
    sgr0=\E(B\E[m,
    smacs=\E(0,
    smam=\E[?7h,
-   smcup=\E[?1049h,
    smir=\E[4h,
    smkx=\E[?1h\E=,
    smm=\E[?1034h,
$ tic xterm-256color-na # loads the file to $HOME/.terminfo
$ find ~/.terminfo -type f
$ HOME/.terminfo/x/xterm-256color-na

これで、次の方法でテストできます。

$ TERM=xterm-256color-na man man # and then hit q

複数の端末を使用する場合は、他の端末に対して上記の手順を繰り返すことができます。すべてが期待どおりに機能する場合はTERM、シェルのrcファイルを使用して設定できます。

端末名をのパラメータとして直接指定することもできますinfocmp。例:

$ infocmp -1 screen > screen

代替画面切り替えを有効にする

一部の端末は代替画面切り替え機能(例:screen)をサポートしています、デフォルトでは無効にしています

以下のためにscreenあなたはそれをあなたを経由して有効にすることができます~/.screenrc

$ cat ~/.screenrc
altscreen

sshを介してリモートログインする場合-たとえば、Solarisシステムはおそらくリモートで構成されたシステム全体のterminfo-databaseが歴史的であるか、壊れているか、または「最先端」の端末と一致しないいくつかの異常な/ Solaris固有のデフォルトを含むsshを実行します。

したがって、ローカルのterminfoデータベースを/ usr / share / infoからhost:~/.terminfo(クライアント上)から(サーバー上)にコピーするだけのオプションです。

コンパイルされたterminfo形式に互換性がない場合は、前の段落のようにエントリをエクスポート/インポートすることもできます。

Cygwinのインストールからterminfo-dbを試し、それをSolaris 10システムに直接コピーしてみました。

別のterminfoデータベースをユーザー間で共有する場合は、TERMINFO環境変数を使用してパスを指定します。

制御シーケンスを無視する

一部の端末は、代替画面切り替えの制御シーケンスの無効化をサポートしています。たとえば、xtermにはオプションがありますが、gnome-terminalにはありません。

xtermの場合はX-ressourceです。たとえば、

XTerm*titeInhibit: true

プログラム固有の構成

一部のプログラムには、送信する制御シーケンス/ terminfoコマンドを構成するための構成ファイルがあります。例えば

$ LESS=X less foo

less画面をクリア/復元しないように設定します。

vimあなたのようなものを含めることができるため

set t_ti= t_te=

あなたで~/.vimrc

トップでその動作を設定する方法のオプションが見つかりません-デフォルトでは、復元画面は送信されません。


sed cmdは実際には、smcupまたはを含む行全体を削除しrmcupます。私の場合、それらと同じラインに他のものが来ています。これらの他のものも削除されました。だから多分何かs/[sr]mcup=[^,]*,//'が良いです
Mingliang 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.