代替画面バッファ (Alternate Screen Buffer) 1

去年の暮の話ですが、色々なAdvent Calendarが開催されるのを見て、端末&端末エミュレータ関連でもAdvent Calendarをやりたいなと思いました。ですが、その時はすでに12月に入って2週間近く経っていたので、来年でいいかと流してしまいました。ただ自分の忘れっぽさを考えると今年の年末もまた忘れていそうだなと思い、年が明けたのでせめて三が日の間だけでも似たような事を出来ないかなとやって見ます。(飽きっぽいのでかなり弱気)
# そもそも初日から遅刻してるし。orz

まず初日は端末エミュレータの特殊機能である“代替画面バッファ (Alternate Screen Buffer)”について書いてみます。

機能概要

viなどでは画面全体を利用して表示を行いますが、viを終了した時に編集中の画面が消え、vi起動前の画面に戻った事はないでしょうか? この時に使われている端末の機能が代替画面バッファ (Alternate Screen Buffer) です。代替画面バッファの機能を一言で言うならば裏画面とでも言えばいいでしょうか。通常使う画面 (Main Screen) の他にもう一画面 (Alternate Screen) を持ち、この二つの画面を切り替えて使用します。
例えばviの場合は起動時に代替画面に切り替え、終了時に主画面に戻る事によって起動前の画面が復活するようになっています。

この機能は好き嫌いが分かれるようで、Tera Termで今まで一番多かった要望が代替画面バッファへの対応だったと思いますが、嫌う人にはとことん嫌われる機能でもあります。そこで、この機能の使い方、おおび無効にする方法についてまとめてみます。

使い方

まず代替画面バッファを使うには、使用している端末が対応している必要があります。これについては今時の端末エミュレータならば大抵は対応しているでしょう。次に使用しているアプリケーション(viやless等)が代替画面バッファを使う事を端末側へ指示する様にする必要があります。これは通常はtermcap/terminfo経由で設定されますので、代替画面バッファを使う端末エントリを環境変数TERMに設定します。例えばLinuxではTERM=xtermで大丈夫ですし、FreeBSD 9ではTERM=xterm-clearにします。

無効化方法

逆に無効にする場合は、代替画面バッファを使わない端末エントリをTERMに設定すればいいのですが、これとは他に端末エミュレータ側で無効に設定できる場合があります。
以下に、端末毎での設定方法をまとめます。

xterm

.Xresource に以下の記述を追加します。

XTerm.titeInhibit: true

mlterm

.mlterm/main に以下の記述を追加します。mlterm 3.1.6以降で使えます。

use_alt_buffer=false

rxvt-unicode

.Xresource に以下の記述を追加します。

URxvt.secondaryScreen: false
URxvt.secondaryScroll: false

Tera Term

TERATERM.INIにあるAlternateScreenBufferを以下のようにoffに書き換えます。
この設定は、将来的には設定ダイアログで変更出来るようになる予定です。

AlternateScreenBuffer=off

PuTTY

設定ダイアログの「端末」-「高度な設定」にある、“Alternate 端末画面への切り替えを無効にする”にチェックを入れます。
altscr-disable-putty

GNU Screen

GNU screenは端末上で動くアプリケーションであると同時に、内部で動くプログラムに対しては端末エミュレータとして振舞うというように、二つの側面があり ます。
まずアプリケーションとして親端末の代替画面バッファの使用を無効化するには、以下の設定を.screenrcに追加します。これは、screenの終了時およびデタッチ時にscreenコマンド実行前の状態に戻るかを制御します。
親端末でのTERM環境変数はxtermの場合の設定です。

termcapinfo xterm 'ti@:te@'

次に、端末エミュレータとして代替画面バッファを提供しないように設定する場合は、以下の設定を.screenrcに追加します。

altscreen off

この設定は、端末での代替画面バッファ設定としては珍しくデフォルトで無効な為、逆にscreen内部で代替画面バッファを使用したい場合はこの設定をonにする 必要が有ります。

tmux

tmuxもGNU Screenと同様にアプリケーションとしての側面と端末エミュレータとしての側面があり、それぞれで代替画面バッファの無効化方法が違います。
まず、アプリケーションとして代替画面バッファを使わないようにするには、.tmux.confに以下の設定を追加します。(親端末のTERMがxtermの場合)

set-option -ag terminal-overrides ",xterm*:smcup@:rmcup@"

端末エミュレータとして、内部で動くプログラムに代替画面バッファを提供しないようにする場合は、.tmux.confに以下の設定を追加します。

set-option -wg alternate-screen off

最後に

端末エミュレータの機能として比較的メジャーでありながら好き嫌いの分かれる代替画面バッファについて、概要と使い方(というか、端末側からの無効化の仕方)を書いて見ました。
# 無効化の比重が大きいのは、自分がこの機能が好きではないというのが影響しています
代替画面バッファの無効化方法としては、他にもtermcap/terminfoの端末エントリを書き換える方法もあります。これについても近い内に書きたいと思います。

You can leave a response, or trackback from your own site.

Leave a Reply

Subscribe to RSS Feed Follow me on Twitter!