Terminal control/Restricted width positional input/No wrapping: Difference between revisions
Content added Content deleted
m (→{{header|Go}}: Removed empty lines at top and bottom of code window.) |
Thundergnat (talk | contribs) (→{{header|Perl 6}}: Add a Perl 6 example) |
||
Line 132: | Line 132: | ||
} |
} |
||
println("You entered '$s'") |
println("You entered '$s'") |
||
}</lang> |
|||
=={{header|Perl 6}}== |
|||
{{works with|Rakudo|2018.10}} |
|||
Should work with any termios compatible terminal. |
|||
All printable character keys work, as does backspace and enter. Ctrl-c to exit. All other keys / key-combos are ignored. |
|||
<lang perl6>use Term::termios; |
|||
constant $saved = Term::termios.new(fd => 1).getattr; |
|||
constant $termios = Term::termios.new(fd => 1).getattr; |
|||
# raw mode interferes with carriage returns, so |
|||
# set flags needed to emulate it manually |
|||
$termios.unset_iflags(<BRKINT ICRNL ISTRIP IXON>); |
|||
$termios.unset_lflags(<ECHO ICANON IEXTEN ISIG>); |
|||
$termios.setattr(:DRAIN); |
|||
END { |
|||
$saved.setattr(:NOW); # reset terminal to original settings |
|||
print "\e[?25h \e[H\e[J"; # clear and reset screen |
|||
} |
|||
my $row = 3; |
|||
my $column = 5; |
|||
my $field = ''; |
|||
my $spacer = ' ' x 8; |
|||
my $pointer = 0; |
|||
my ($rows,$cols) = qx/stty size/.words; # get screen size |
|||
my @screen = "\e[41m{' ' x $cols}\e[0m" xx $rows; |
|||
update($spacer); |
|||
loop { |
|||
my $key = $*IN.read(4).decode; |
|||
given $key { |
|||
when ' '..'~' { |
|||
if $pointer < 8 { |
|||
$field ~= $_; |
|||
$spacer = ' ' x 8 - $field.chars; |
|||
$pointer +=1; |
|||
update($field~$spacer) |
|||
} |
|||
} |
|||
when "\c[127]" { # backspace |
|||
if $pointer > 0 { |
|||
$field.=substr(0,*-1); |
|||
$spacer = ' ' x 8 - $field.chars; |
|||
$pointer -= 1; |
|||
update($field~$spacer) |
|||
} |
|||
} |
|||
when "\c[13]" { |
|||
update(' '); |
|||
print "\e[10;6H\e[1;33;41mYou entered: $field\e[0m\e[$row;{$column}H"; |
|||
$field = ''; |
|||
$pointer = 0; |
|||
} |
|||
when "\c[0003]" { exit } # Ctrl-c |
|||
default { } |
|||
} |
|||
} |
|||
sub update ($str) { |
|||
($rows,$cols) = qx/stty size/.words; |
|||
@screen = "\e[41m{' ' x $cols}\e[0m" xx $rows; |
|||
print "\e[H\e[J{@screen.join: "\n"}\e[$row;{$column}H$str\e[$row;{$column + $pointer}H"; |
|||
}</lang> |
}</lang> |
||