0

Mac の Screen のマニュアルの次のステートメントに従って、自動マージンをオフにする必要があります。

あなたの端末が「真の」自動マージン端末 (画面をスクロールせずに画面の最後の位置を更新することを許可しない) である場合、自動マージンがオフになっている端末の termcap のバージョンを使用することを検討してください。

端末の termcap で自動マージンをオフにするにはどうすればよいですか?

4

3 に答える 3

2

Mac のデフォルト ターミナルを含むほとんどのターミナル エミュレータは、ここで説明する意味での「真の自動マージン ターミナル」ではありません。cat最後の行の最後まで実行して入力することで確認できます。最後の文字を入力すると、別の文字を入力するまで、カーソルは行の最後に残ります (入力した文字が強調表示されます)。

「真の自動マージン端末」の唯一の結果は、文字を右下隅に表示できないことです (ただし、一部のプログラムは、文字をich/で所定の位置に移動することで回避できますich1) 。

于 2016-09-28T01:42:48.693 に答える
1

XTerm Control Sequencesによると、このシーケンスは要求されたことを実行する必要があります。

CSI ? 7 l

あれは、

printf '\033[?7l'

7は次のように文書化されています

        Ps = 7  -> Wraparound Mode (DECAWM).

最後の文字l(小文字の L) は、これをセット制御ではなくリセットとして示します。

なんらかの理由で、これの terminfo 名はよりあいまいです: 「自動マージン」。これらの terminfo 機能は、この機能を扱います ( terminfo(5)を参照):

   auto_right_margin             am         am        terminal has auto‐
                                                      matic margins
   enter_am_mode                 smam       SA        turn on automatic
                                                      margins
   exit_am_mode                  rmam       RA        turn off automatic
                                                      margins

興味深いことに、ncurses のvt100-nam端末記述 (これは明らかに誰も使用していません) は、次の文字列を使用して automargins マージンを使用するように端末を初期化します。

rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, 

( が\E[?7h設定) をキャンセルし、端末が自動マージンを使用しないことをアサートしamます。また、terminfo 機能rmamsmam. したがって、これを実行して、それが機能することを証明できます。

tput rmam
stty columns 999
ps -efwwwwwl

(通常のユーザーの場合)ps端末ウィンドウの右マージンに対して適切に切り捨てられたリストが表示されます。

他の亜種 vt220-nam と vt320-nam は正しいようです...

ちなみに、Macの場合、OSX は BSD バリアントではなく ncurses の tput (terminfo) を使用するため、 termcapではなくなどのterminfo名を使用します。rmcup RA

参考文献:

時折、誰かが自動マージンの抑制について質問します。なぜなら、端末が左右にパン/スクロールして、新しい行に折り返されていない情報を表示できると考えているからです。これを行う端末はまれであり、OSX 端末はそれらの 1 つではありません。これは、一連の DEC 端末 vt52/vt100/vt220/etc をエミュレートする xterm のサブセットのように動作します。この質問で、OPはマニュアルのこの段落について懸念/混乱していscreenます:

お使いの端末が「真の」自動マージン端末である場合 (画面の最後の位置を許可しません) 画面をスクロールせずに更新するには、自動マージンがオフになっている端末の termcap のバージョンを使用することを検討してください。これにより、あらゆる状況で画面が正確かつ最適に更新されます。現在、ほとんどの端末には「魔法の」マージン (自動マージンと使用可能な最後の列) があります。スクリーンに最適なVT100タイプです。あなたが持っているのが「真の」自動マージン端末画面であれば、それを使用するのに満足するでしょうが、画面の最後の位置に置かれた文字を更新することは、画面がスクロールするか、文字が他の方法で安全な位置に。この遅延は、文字挿入機能を備えた端末を使用することで短縮できます。

画面上の最後の位置は、端末の右下隅を指します。通常、カーソルが右下隅にあり、文字を印刷すると、ディスプレイが 1 行上にスクロールし、次の行に文字が表示されると予想されます。また(端末はさまざまな方法で実装できるため)、最後の位置に文字を出力するとスクロールアップする可能性があります。VT100 はこれを行いません。その場合、上にスクロールしないだけでなく、余白ある非印刷文字を無視します (xterm FAQ を参照してください。折り返しの説明がおかしい、もっと言えば? )。terminfo フラグがありますxenlこれは、端末がこの特別な動作を行うときに表示するように設定されています。端末データベース内の端末記述の約 3 分の 1 に、このフラグがあります。それらのほとんどは、おそらく遭遇することのない端末向けですが、マニュアルページのアドバイスは、他の端末が VT100 に似たものとして見つかる可能性が高い時代にさかのぼって書かれたものであることを覚えておいてください。screen の初期の変更履歴はよくありませんが、テキストは screen が 1992 年に Usenet に投稿した 2 回目の投稿に含まれていました。

LP端末の termcap エントリでブール値の機能が見つからない限り、screen は画面 の最後の位置に書き込むことはありません。通常、 最後の行の最後の列に文字が書き込まれたときに、特定の端末がスクロールするかどうか をscreenは予測できません。LPこの位置に書き込んでも安全であることを示します。この機能は(自動マージン)LPとは無関係であることに注意してください。amVT100 などの特定の端末では、対応する termcap エントリamと同様に設定するのが合理的ですLP(VT100 は、文字が各行の最後の列に書かれている場合、カーソルを移動しません)。

terminfo後者の言い回しは、システムが普及していたという事実を反映しており、その名前LPは対応するために選択された termcap 名ではありませんでしたxenl(それは ですxn)。

このすべてのポイントは、screen異なる端末タイプに書き込むプログラム間で変換を試み、それらすべてを 1 つのタイプの端末のように見せようとすることです。つまり、端末のディスプレイのすべての場所にテキストを表示しようとします。一部の端末では上にスクロールし、そこに書き込もうとして失敗するため、右下隅が問題になります。回避策として、一部の端末では代替手段が提供されていました。

  • 別のモード (挿入) を使用して、
  • ディスプレイの最後の位置の次の位置にカーソルを置き、
  • 埋める文字を書き、文字を最後の位置に押し込みます。
  • 完了したら、挿入モードをオフにします (そうしないと面倒です)。

端末データベースの記述の約 3 分の 2 には、この挿入モードを実行する機能があります ( smir)。それはまだ完全ではありませんでしたが、1992 年には確かに言及する価値がありました。約 4 分の 1 が同様の機能を実装していますich1。両方を実装するものもあります (vi両方の方法を実行しようとすると、混乱する可能性があります)。

VT100 に似たものは、その最後の位置を書き込むための 3 番目の方法を提供します。screenそこにあるものをすべてチェックして使用します。

于 2016-09-28T20:30:18.453 に答える
0

私があなたを正しく理解していれば、terminfo データベースを使用して autowrap 機能を NO に設定しようとしています。もしそうなら、 -nam フラグを使ってオフにできると思います - vt100-nam のような何かがそれをするべきです。terminfo の man ページを見て確認することもできます。

これで質問が解決する場合は、これをマークアップしてください。(^_^) そうでない場合は、コメントを返してください。もう一度確認します。乾杯!

更新: ラップのオンとオフを切り替えるために適用されるショートカットもあります。ここでショートカットシートをチェックしてください。また、Screen の追加情報については、こちらを参照してください(wrap を検索してください)。また、setterm の使用方法については、こちらを参照してください (セクション 17.14 ターミナル設定の変更)。設定変更例はこちらもご確認ください。

もう一度頑張ってください。(^_^)

于 2009-05-01T07:48:38.427 に答える