Ringing the Terminal Bell
Problem
You want to sound an alarm on the user’s terminal.
Solution
Print the "\a"
character to sound a bell:
print "\aWake up!\n";
Or, use the "vb"
terminal capability to show a
visual bell:
use Term::Cap; $OSPEED = 9600; eval { require POSIX; my $termios = POSIX::Termios->new(); $termios->getattr; $OSPEED = $termios->getospeed; }; $terminal = Term::Cap->Tgetent({OSPEED=>$OSPEED}); $vb = ""; eval { $terminal->Trequire("vb"); $vb = $terminal->Tputs('vb', 1); }; print $vb; # ring visual bell
Discussion
The "\a"
escape is the same as
"\cG"
, "\007"
, and
"\x07"
. They all correspond to the ASCII BEL
character and cause an irritating ding. In a crowded terminal room at
the end of the semester, this beeping caused by dozens of
vi novices all trying to get out of insert mode
at once can be maddening. The visual bell is a workaround to avoid
irritation. Based upon the polite principle that terminals should be
seen and not heard (at least, not in crowded rooms), some terminals
let you briefly reverse the foreground and background colors to give
a flash of light instead of an audible ring.
Not every terminal supports the visual bell, which is why we
eval
the code that finds it. If the terminal
doesn’t support it, Trequire
will
die
without having changed the value of
$vb
from ""
. If the terminal
does support it, the value of $vb
will be set to
the character sequence to flash the bell.
There’s a better approach to the bell issue in graphical terminal systems like xterm. Many ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.