Skip to content

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_line
use ratatui::crossterm::{ // hide_line
terminal::{EnterAlternateScreen, LeaveAlternateScreen}, // hide_line
ExecutableCommand, // hide_line
}; // hide_line
use ratatui::{prelude::*, widgets::*}; // hide_line
// hide_line
fn 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 を試してみてください。

すべてのターミナルエミュレーターが代替画面をサポートしているわけではなく、それを行う可能性のある画面も異なる方法で処理できるわけではないことに注意してください。その結果、動作は使用されているバックエンドによって異なる場合があります。特定のバックエンドのドキュメントを必ず参照して、代替画面をどのように実装するかを理解してください。