[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:15335] Re: less の終了時の動作について



松田健一と申します。

>> lessを終了するときなんですが、
>> qを押して、終了した途端に
>> 1.lessで見ていた画面が消えて、lessを開始したときのプロンプトに戻る。
>> 2.lessで見ていた画面はそのままで残り、画面最下行にプロンプトが現われる。
>> 
>> の2つのパターンがあるのですが、この違いはどこから起きるのでしょうか。

less で使用している端末情報データベース terminfo の設定の違いから
きています。

less (実は less が内部で使用している curses ライブラリですが) は、
使用している端末の名前が入った環境変数 TERM を元に、端末を制御する
エスケープシーケンスの情報を入手し、それを使用して画面を制御しています。

コマンド infocmp を実行すると、そのセッションの現在の terminfo の情報
を見ることができます。(以下、私のセッションの例です)

  % infocmp
  #     Reconstructed via infocmp from file: /home/kmatsuda/.terminfo/k/kterm
  kterm|kterm kanji terminal emulator (X window system), 
        am, eslok, hs, km, msgr, xenl, xon, 
        cols#80, it#8, lines#54, 
        bel=^G, bold=\E[1m, civis=\E[?25l, clear=\E[H\E[2J, 
        ...(一部省略)

        rev=\E[7m, ri=\EM, rmcup=\E[2J\E[?47l\E8, rmir=, 
        ...
        sgr0=\E[m\017, smcup=\E7\E[?47h, smir=, smkx=\E[?1h\E=, 
        ...

端末の属性情報とか、画面を細かく制御する機能がどういうエスケープシー
ケンスで実行できるかという情報が表示されます。

ここで注目して欲しいのが、smcup と rmcup の 2つの機能です。

  % man 5 terminfo

を見て欲しいのですが、smcup は、プログラムスタート時に、rmcup はプログ
ラム終了時にそれぞれエスケープシーケンスが自動的に端末に流されます。

VT100 系の端末 (xterm とか kterm とかはその系列です) では、以下のエス
ケープシーケンスが利用できます。

  "\E[?47h"   その時点での画面イメージを保存する
  "\E[?47l"   保存していた画面イメージをリストアする

これを使用して less は画面を元に戻しています。

> man less には、optionの所に
>  -X     Disables sending  the  termcap  initialization  and
>         deinitialization  strings to the terminal.  This is
>         sometimes desirable if the deinitialization  string
>         does   something  unnecessary,  like  clearing  the
>         screen.
> って書いてありますがこれのことかな?

そうですね、-X を設定すると、smcup と rmcup の 2つの機能を使用しないよ
うにするのだと思います。

それから、確かシステムで提供されている terminfo にも複数のバージョン
が存在するということを聞いたことがありますし、kterm と xterm とかの端
末エミュレータの種類によって、smcup と rmcup の定義が異なっているのか
もしれません。

> manualは読むといろいろ分かりますよ、
> man command
> commandのmanualが読めます。

本当にそのとおりだと思います。で、どのマニュアルをみると回答があるのか、
あるいは、どうやって回答のあるマニュアルを探していくかが、結構経験を必要
としますね。

昔、はまって terminfo のエントリを自分の好みに改造していたことがあるの
で思わず反応してしまいました。 

失礼します。

----
Keni

=========================================================================
KENICHI MATSUDA	                E-MAIL: kmatsuda@xxxxxxxxxxxxx (Japan)
                                        kmatsuda@xxxxxxxxxxxxx (U.S.)
                                PHONE:  603-897-3260
                                FAX:    603-897-3317

ORACLE NEW ENGLAND DEVELOPMENT CENTER
ONE ORACLE DRIVE
NASHUA, NH 03062
=========================================================================