Alternate Screen
代替画面は、メイン画面とは異なるターミナルが提供する個別のバッファーです。アクティブ化されると、ターミナルはメイン画面の現在のコンテンツを隠し、代替画面を表示します。アプリケーションは、この画面に通常のターミナルディスプレイであるかのように書き込むことができますが、アプリケーションが終了すると、ターミナルがメイン画面に戻り、代替画面の内容がクリアされます。これは、コマンドラインやその他のターミナルコンテンツを破壊せずに完全なターミナルウィンドウを使用したいテキストエディターやターミナルゲームなどのアプリケーションに役立ちます。
これにより、アプリケーションの起動前に表示されるコンテンツがアプリケーションの終了後に再表示されるため、アプリケーションと通常のターミナルセッションとの間にシームレスな移行が作成されます。
以下のこの「Hello World」プログラムをご覧ください。 std::io::stderr().execute(EnterAlternateScreen)?
(および対応する LeaveAlternateScreen
) の有無にかかわらず実行すると、プログラムがどのように異なる動作をするかを確認できます。
use std::{ // hide_line io::{stderr, Result}, // hide_line thread::sleep, // hide_line time::Duration, // hide_line}; // hide_line// hide_lineuse ratatui::crossterm::{ // hide_line terminal::{EnterAlternateScreen, LeaveAlternateScreen}, // hide_line ExecutableCommand, // hide_line}; // hide_lineuse ratatui::{prelude::*, widgets::*}; // hide_line// hide_linefn main() -> Result<()> { // hide_line let should_enter_alternate_screen = std::env::args().nth(1).unwrap().parse::<bool>().unwrap(); // hide_line if should_enter_alternate_screen { // hide_line stderr().execute(EnterAlternateScreen)?; // remove this line } // hide_line
let mut terminal = Terminal::new(CrosstermBackend::new(stderr()))?;
terminal.draw(|f| { f.render_widget(Paragraph::new("Hello World!"), Rect::new(10, 20, 20, 1)); })?; sleep(Duration::from_secs(2));
if should_enter_alternate_screen { // hide_line stderr().execute(LeaveAlternateScreen)?; // remove this line } // hide_line Ok(()) // hide_line} // hide_line
このコードを独自に実行して、 EnterAlternateScreen
および LeaveAlternateScreen
を試してみてください。
すべてのターミナルエミュレーターが代替画面をサポートしているわけではなく、それを行う可能性のある画面も異なる方法で処理できるわけではないことに注意してください。その結果、動作は使用されているバックエンドによって異なる場合があります。特定のバックエンドのドキュメントを必ず参照して、代替画面をどのように実装するかを理解してください。