1

moshを使用して、リモートの Ubuntu マシンにアクセスしています。私が Windows で使用しているクライアントは、mosh プラグインを備えた MobaXterm です。私が Ubuntu で使用しているのは、apt-get から取得した mosh クライアントだけです。問題は、通常、bash で vim を開いてコードを編集し、 Ctrl+Zを使用して bash に戻ることです。そして、 fgを使用して vim を戻します。しかし、Ctrl+Z を押すと、コードの内容は端末ウィンドウに残り、その下に bash が表示されます。SSH は完全に機能します。コードが消えて、このようなものだけが表示されます。

[1]+  Stopped                 vim .bashrc

これは私の端末設定に関連していると思います。Ubuntu のデフォルト設定を使用します。$TERMはxtermを返します。私が MobaXterm で使用している端末もxtermです。SSH接続と同じ結果を得るにはどうすればよいですか?

4

1 に答える 1

1

画面がクリアされ、短いメッセージだけが残る動作は、xterm の通常画面と代替画面を切り替えるプログラムのように聞こえます。MobaXterm は、xterm からこの機能を実装する PuTTY を使用します。

の設定TERMは、使用する端末の説明を termcap/terminfo/curses ライブラリーに伝えます。違いは次のとおりです。

  • mosh プログラムの場合、そのライブラリはローカル マシンにあります。
  • ssh を使用する場合、そのライブラリはリモート マシン上にあります。

それよりも複雑です: vim は実際にはそれを実行しているマシンで端末データベースを使用していますが、mosh はどのエスケープ シーケンスが端末に送信されるかについて最終的な決定権を持っています。そのため、mosh が、smcupおよびrmcupterminfo 機能が "xterm" に代替画面への/からの切り替えを指示しないローカル端末の説明を見ているように聞こえます。

確認できるMobaXtermは手元にありませんが、確認できます。mosh は curses/ncurses プログラムです。したがって、MobaXterm にもinfocmpプログラムがあると考えるのが妥当です。このinfocmpプログラムを使用すると、端末データベースがこれらの値に対して何を持っているかを確認できます。

smcup=\E[?1049h,
rmcup=\E[?1049l,

また

smcup=\E[?47h,
rmcup=\E[2J\E[?47l,

後者はオリジナルの xterm シーケンス (1990 年代前半) で、前者は最新の xterm (1990 年代後半) です。興味深いことに、一部の「xterm」エミュレーターは新しいものを実装していません。詳細は xterm の FAQにあります vi の実行時に画面がクリアされないのはなぜですか?

あなたが持っているならinfocmp、あなたはおそらく持っているでしょうtic。ローカル端末データベースを変更するには、

  • infocmp端末の説明を含むファイルを作成するために使用します
  • ファイルを編集します(これら2つの行を追加するか、新しい値が機能しない場合は古い値を使用します)
  • tic端末の説明を再コンパイルするために使用します

(MobaXterm が curses ユーティリティなしで mosh を提供する場合、MobaXterm でバグ レポートを提出する以外にできることはあまりありません)。

上記は 6 月 8 日に書かれたものです。私は昨夜 MobaXterm を見て、いくつかのコメントがあります。

  • MobaXterm は自己完結型 (busybox を使用するアプリケーション) であるため、通常はあまり注意を払いません。
  • xterm のやや古い端末の説明があります (特定できましたが、おそらく 5 ~ 8 年前のものです)。
  • 代替画面切り替えはずっと古いものであり、やるべきことがあまりないことを指摘したように、私はそれ以上調査しませんでした.
  • 必要に応じて、コンパイル済みの terminfo エントリを Linux からコピーできます (ただし、これは面倒です)。

Ubuntu の場合、gnome-terminal と xterm で vim を実行している 14.04 マシンを簡単に調べました。gnome偶然にも、私は最近前者の端末の説明を見直していて、 (廃止された) またはvte(推奨) のために書いたエントリが古い xterm smcup/を使用していることに気付きましたrmcup。Ubuntu 14.04 は古いため、gnome-terminal は新しい xtermsmcupを正しく認識せず、 を使用して別の画面に切り替えませんでしたTERM=xterm。しかし、それはTERM=vte(またはTERM=gnome)で動作しました。ncurses-termパッケージがインストールされている場合、これらの説明が表示されます。

于 2015-06-08T08:52:25.453 に答える