Terminal control/Preserve screen: Difference between revisions
Terminal control/Preserve screen (view source)
Revision as of 15:23, 14 February 2024
, 4 months agoadded RPL
Alextretyak (talk | contribs) (Added 11l) |
(added RPL) |
||
(4 intermediate revisions by 4 users not shown) | |||
Line 12:
{{trans|Python}}
<
print(‘Alternate buffer!’)
Line 19:
sleep(1)
print("\033[?1049l")</
=={{header|Action!}}==
<
BYTE RTCLOK=$14
frames==+RTCLOK
Line 48:
Wait(200)
MoveBlock(ptr,buffer,size) ;restore screen content
RETURN</
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Preserve_screen.png Screenshot from Atari 8-bit computer]
Line 54:
=={{header|Applesoft BASIC}}==
Restores 40 x 24 TEXT screen, cursor position, display mode, and speed. Adjusts HIMEM to make room to store 1024 bytes aligned to the 256 byte page boundary. POKEs a machine language "copy 4 pages of memory" routine into page 3.
<
11 LET FD = 253:FC = FD - 1
12 POKE FC, 0 : POKE FE, 0
Line 103:
61 CALL R : POKE 241, S
62 VTAB V + 1 : HTAB C + 1
63 POKE 50, M : POKE 243, F</
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
The screen is saved as a bitmap:
<
OSCLI "GSAVE """ + @tmp$ + "bbcsave"""
WAIT 200
Line 114:
PRINT "This is the new screen, following a CLS"
WAIT 200
OSCLI "DISPLAY """ + @tmp$ + "bbcsave"""</
=={{header|Befunge}}==
Line 120:
Assuming a terminal with support for Xterm's [http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer ''alternate screen buffer''] escape sequences (which I believe is fairly standard these days), this example will switch to the alternate screen buffer, output "Press <Enter> to restore..." in the top left corner, and then restore the original screen.
<
=={{header|C}}==
For Xterm. "Allow alternate screen buffer" must be enabled by the popup menu.<
#include <unistd.h>
Line 139:
return 0;
}</
=={{header|Common Lisp}}==
{{trans|C}}
<
(format t "~C[?1049h~C[H" (code-char #O33) (code-char #O33))
(format t "Alternate screen buffer~%")
Line 151:
))
(format t "~C[?1049l" (code-char #O33))
</syntaxhighlight>
==={{header|ncurses}}===
When the ncurses terminal library is used, characters are displayed on an alternate screen of the terminal. Leaving ncurses returns to the original screen buffer with the previous content preserved. To interface ncurses from Lisp, the ''croatoan'' library is used.
<
;; starting a ncurses screen enters the alternate screen buffer of the terminal
(with-screen (scr :input-echoing nil :input-blocking t)
Line 165:
(refresh scr)
(get-char scr)))
;; leaving ncurses returns the terminal to the main screen buffer</
=={{header|Emacs Lisp}}==
<
;; -*- lexical-binding: t; -*-
Line 185:
;; "ESC [ ? 1049 l" - Disable alternative screen buffer
(princ "\033[?1049l")</
=={{header|Forth}}==
{{trans|C}}
{{works with|gforth|0.7.3}}
<
." Press any key to return" ekey drop
.\" \033[?1049l" \ restore screen</
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">'' 640x480x8, with 3 pages
Screen 12,,3
Windowtitle "Terminal control/Preserve screen"
'' text for working page #2 (visible page #0)
Screenset 2, 0
Cls
Print "This is the new screen, following a CLS"
'' text for working page #1 (visible page #0)
Screenset 1, 0
Cls
Print "This is the original screen"
' page #0 is the working page (visible page #0)
Screenset 0, 0
Screencopy 1, 0
Sleep 1000 '1 second
Screencopy 2, 0
Sleep 1000
Print
For i As Byte = 5 To 1 Step -1
Sleep 1000
Next i
Screencopy 1, 0
Sleep</syntaxhighlight>
=={{header|Go}}==
{{trans|C}}
{{works with|Ubuntu 16.04}}
<
import (
Line 216 ⟶ 248:
}
fmt.Print("\033[?1049l")
}</
=={{header|Java}}==
{{trans|C}}
{{works with|Ubuntu 16.04}}
<
{
public static void main(String[] args) throws InterruptedException {
Line 233 ⟶ 265:
System.out.print("\033[?1049l");
}
}</
=={{header|JavaScript}}==
<
var orig= document.body.innerHTML
document.body.innerHTML= '';
Line 245 ⟶ 277:
}, 1000);
}, 1000);
})();</
This implementation assumes that Javascript is running in the browser.
Line 253 ⟶ 285:
=={{header|Julia}}==
{{trans|C}}
<
print("$ESC[?1049h$ESC[H")
Line 260 ⟶ 292:
print("$ESC[?1049l\n\n\n")
</syntaxhighlight>
=={{header|Kotlin}}==
{{trans|C}}
{{Works with|Ubuntu|14.04}}
<
const val ESC = "\u001B"
Line 277 ⟶ 309:
}
print("$ESC[?1049l")
}</
=={{header|M2000 Interpreter}}==
Line 285 ⟶ 317:
If we change Mode (size of font), or Window size (console witdh/height), or use a Form statement to set character resolution (number characters in a row by row number) which automatic calculate size and line spacing, then saved consoled bitmap erased. To preserve screen from this situation we have to preserve last form's arguments, or window's arguments or mode's argument.
<syntaxhighlight lang="m2000 interpreter">
Module PreserveScreen {
Bold 1
Line 333 ⟶ 365:
PreserveScreen
</syntaxhighlight>
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<
Run["echo Hello"]
Pause[5] (* Wait five seconds *)
Run["tput rmcup"] </
=={{header|Nim}}==
{{trans|Python}}
<
echo "\e[?1049h\e[H"
Line 352 ⟶ 384:
sleep 1000
echo "\e[?1049l"</
=={{header|Perl}}==
{{trans|C}}
<
print "Alternate screen buffer\n";
Line 364 ⟶ 396:
}
print "\033[?1049l";</
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(notonline)-->
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (save_text_image, sleep, display_text_image)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">save_text_image</span><span style="color: #0000FF;">({</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">25</span><span style="color: #0000FF;">,</span><span style="color: #000000;">80</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">clear_screen</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n\n *** hello ***\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">sleep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">5</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">display_text_image</span><span style="color: #0000FF;">({</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
The following also works fine on linux (but not windows)▼
<span style="color: #7060A8;">sleep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
▲The following also works fine on linux (but not windows, or under p2js)
<!--<syntaxhighlight lang="phix">(notonline)-->
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (escape sequences, sleep)</span>
▲ printf(1,"Going back in:%d\r", i)
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\e[?1049h\e[H"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Alternate buffer!\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">5</span> <span style="color: #008080;">to</span> <span style="color: #000000;">0</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Going back in:%d\r"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">sleep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\e[?1049l"</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
=={{header|PicoLisp}}==
<
(call 'tput "smcup")
Line 391 ⟶ 429:
(call 'tput "rmcup")
(bye)</
=={{header|Python}}==
Similar to the C example above:
<
import time
Line 407 ⟶ 445:
time.sleep(1)
print "\033[?1049l"</
=={{header|R}}==
{{trans|C}}
<
cat("Alternate screen buffer\n")
for (i in 5:1) {
Line 418 ⟶ 456:
cat("\33[2J")
}
cat("\033[?1049l")</
=={{header|Racket}}==
<syntaxhighlight lang="racket">
#lang racket
Line 433 ⟶ 471:
(flash "Hello world.")
</syntaxhighlight>
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku"
say "Alternate buffer!";
Line 445 ⟶ 483:
}
print "\e[?1049l";</
=={{header|REXX}}==
Line 451 ⟶ 489:
The '''CLS''' (DOS) command is used to clear the terminal screen.
<
/*──── screen, writes a half screen of ~~~ lines, and then restores the original screen.*/
Line 469 ⟶ 507:
end /*restore*/ /* [↑] writes (restores) SD lines. */
/*stick a fork in it, we're all done. */
call cursor curRow, curCol /*restore the original cursor position.*/</
This REXX program makes use of '''scrsize''' BIF which is used to determine the screen size of the terminal (console).
For those REXXes that don't have the '''scrsize''' BIF, the '''SCRSIZE.REX''' REXX program is included here ──► [[SCRSIZE.REX]]. <br><br>
=={{header|RPL}}==
« LCD→ @ Preserve the current state of the screen (put a bitmap object in the stack)
CLLCD @ Clear the screen
"Something" 1 DISP @ Output something on the display
→LCD @ Restore the screen to the preserved state (through the bitmap present in the stack)
» '<span style="color:blue">TASK</span>' STO
=={{header|Rust}}==
{{trans|C}}
Uses xterm escape codes.
<
use std::time::Duration;
Line 492 ⟶ 537:
print!("\x1b[?1049l");
}</
The Rust [https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html inclusive range operator] is used as an iterator from 1 to 5 (inclusive). It is then reversed to count down.
Line 500 ⟶ 545:
Similar to the C example above:
<
println("Alternate buffer!")
Line 508 ⟶ 553:
}
print("\033[?1049l")</
=={{header|Sidef}}==
{{trans|Raku}}
<
say "Alternate buffer!";
Line 520 ⟶ 565:
}
print "\e[?1049l";</
=={{header|Swift}}==
{{trans|C}}
<
public let CSI = ESC+"[" // Control Sequence Introducer
func write(_ text: String...) {
Line 536 ⟶ 581:
}
write(CSI,"?1049l") // close alternate screen
</syntaxhighlight>
=={{header|Tcl}}==
On Unix terminals only, with the help of <tt>tput</tt>:
<
proc terminal {args} {
exec /usr/bin/tput {*}$args >/dev/tty
Line 551 ⟶ 596:
gets stdin
# Restore the screen with the "exit_ca_mode" capability, a.k.a. 'rmcup'
terminal rmcup</
=={{header|UNIX Shell}}==
Line 557 ⟶ 602:
{{works with|Bourne Shell}} {{works with|bash}}
<
tput smcup # Save the display
echo 'Hello'
sleep 5 # Wait five seconds
tput rmcup # Restore the display</
=={{header|Wren}}==
{{trans|C}}
<
import "timer" for Timer
Line 576 ⟶ 621:
Timer.sleep(1000)
}
System.write("\e[?1049l")</
=={{header|XPL0}}==
<
proc SetPage(P); \Select active display page for video screen
Line 594 ⟶ 639:
if ChIn(1) then []; \wait for keystroke
SetPage(0); \restore original, default text screen, page 0
]</
=={{header|Z80 Assembly}}==
Line 600 ⟶ 645:
Using the Amstrad CPC firmware:
<
txt_output: equ $bb5a
Line 644 ⟶ 689:
ret
text: defm "This is some text. Please press a key.\0"</
=={{header|zkl}}==
{{trans|C}}
Works in a Mint Linux terminal, switching to the alternate screen buffer, printing a count down message and then switching back.
<
println("Alternate screen buffer");
foreach i in ([5..1,-1]){
Line 655 ⟶ 700:
Atomic.sleep(1);
}
print("\e[?1049l");</
|