Use readline::gnu instead of readline::ttytter. A few weird bugs left to go, but I'm pretty sure we're close to going public.

This commit is contained in:
Storm Dragon
2025-07-28 00:23:10 -04:00
parent 872c0dac93
commit 713926ba86
+31 -48
View File
@@ -113,7 +113,7 @@ BEGIN {
# verbose=0 # Show debug information # verbose=0 # Show debug information
# superverbose=0 # Even more debug information # superverbose=0 # Even more debug information
# silent=0 # Reduce output messages # silent=0 # Reduce output messages
# readline=1 # Use readline for input (if available) # readline=0 # Disable readline for input (enabled by default)
# readlinerepaint=0 # Repaint readline on signals # readlinerepaint=0 # Repaint readline on signals
# vcheck=1 # Check for updates on startup # vcheck=1 # Check for updates on startup
# noprompt=0 # Disable interactive prompts # noprompt=0 # Disable interactive prompts
@@ -496,14 +496,29 @@ EOF
# try to init Term::ReadLine if it was requested # try to init Term::ReadLine if it was requested
# (shakes fist at @br3nda, it's all her fault) # (shakes fist at @br3nda, it's all her fault)
%readline_completion = (); %readline_completion = ();
$readline = 1 if (!defined $readline); # Enable readline by default
print STDOUT "-- DEBUG: readline=$readline, silent=$silent, script=$script\n" if ($verbose);
if ($readline && !$silent && !$script) { if ($readline && !$silent && !$script) {
$ENV{"PERL_RL"} = "TTYverse" if (!length($ENV{'PERL_RL'})); $ENV{"PERL_RL"} = "Gnu" if (!length($ENV{'PERL_RL'}));
print STDOUT "-- DEBUG: PERL_RL set to: $ENV{'PERL_RL'}\n" if ($verbose);
print STDOUT "-- DEBUG: TERM environment: $ENV{'TERM'}\n" if ($verbose);
eval eval
'use Term::ReadLine; $termrl = new Term::ReadLine ("TTYverse", \*STDIN, \*STDOUT)' 'use Term::ReadLine; $termrl = new Term::ReadLine ("TTYverse", \*STDIN, \*STDOUT)';
|| die( if ($@) {
"$@\nthis perl doesn't have ReadLine. don't use -readline.\n"); print STDOUT "-- ReadLine not available, disabling readline features\n" if ($verbose);
$stdout = $termrl->OUT || \*STDOUT; $readline = 0;
$stdin = $termrl->IN || \*STDIN; $termrl = undef;
} else {
$stdout = $termrl->OUT || \*STDOUT;
$stdin = $termrl->IN || \*STDIN;
print $stdout "-- DEBUG: ReadLine implementation: " . $termrl->ReadLine . "\n" if ($verbose);
print $stdout "-- DEBUG: ReadLine features: " . join(", ", $termrl->Features) . "\n" if ($verbose);
}
}
if (!$readline || $silent || $script || !$termrl) {
$stdout = \*STDOUT;
$stdin = \*STDIN;
} else {
$readline = '' if ($readline eq '1'); $readline = '' if ($readline eq '1');
$readline =~ s/^"//; # for optimizer $readline =~ s/^"//; # for optimizer
$readline =~ s/"$//; $readline =~ s/"$//;
@@ -512,9 +527,6 @@ EOF
%original_readline = %readline_completion; %original_readline = %readline_completion;
# readline repaint can't be tested here. we cache our # readline repaint can't be tested here. we cache our
# result later. # result later.
} else {
$stdout = \*STDOUT;
$stdin = \*STDIN;
} }
$wrapseq = 0; $wrapseq = 0;
$lastlinelength = -1; $lastlinelength = -1;
@@ -619,18 +631,9 @@ EOF
eval 'use POSIX; $termios = new POSIX::Termios;'; eval 'use POSIX; $termios = new POSIX::Termios;';
print $stdout "-- termios test: $termios\n" if ($verbose); print $stdout "-- termios test: $termios\n" if ($verbose);
# check the TRLT version. versions < 1.3 won't work with 2.0. # Term::ReadLine::Gnu is well-maintained and compatible
if ($termrl && $termrl->ReadLine eq 'Term::ReadLine::TTYverse') { if ($termrl && $termrl->ReadLine eq 'Term::ReadLine::Gnu') {
eval '$trlv = $termrl->Version;'; print $stdout "-- using Term::ReadLine::Gnu for enhanced readline support\n" if ($verbose);
die (<<"EOF") if (length($trlv) && 0+$trlv < 1.3);
*** death permeates me ***
you need to upgrade your Term::ReadLine::TTYverse to at least version 1.3
to use TTYverse 2.x, or bad things will happen such as signal mismatches,
unexpected quits, and dogs and cats living peacefully in the same house.
EOF
print $stdout "** t.co support needs Term::ReadLine:TTYverse 1.4+ (-notco to ignore)\n"
if (length($trlv) && !$notco && 0+$trlv < 1.4);
} }
# try to get signal numbers for SIG* from POSIX. use internals if failed. # try to get signal numbers for SIG* from POSIX. use internals if failed.
@@ -1893,7 +1896,12 @@ sub defaultmain {
$tco_sub = sub { return &main::fastturntotco(shift); }; $tco_sub = sub { return &main::fastturntotco(shift); };
eval '$termrl->hook_no_tco'; eval '$termrl->hook_no_tco';
if ($termrl) { if ($termrl) {
print $stdout "-- DEBUG: Starting readline loop with implementation: " . $termrl->ReadLine . "\n" if ($verbose);
print $stdout "-- DEBUG: Terminal capability check - can cursor move: " . ($termrl->can('Attribs') ? "yes" : "no") . "\n" if ($verbose);
while(defined ($_ = $termrl->readline((&$prompt(1))[0]))) { while(defined ($_ = $termrl->readline((&$prompt(1))[0]))) {
if ($verbose && /[\x1b\[\x5b]/) {
print $stdout "-- DEBUG: Arrow key detected in input: " . join("", map { sprintf("\\x%02x", ord($_)) } split(//, $_)) . "\n";
}
kill $SIGUSR1, $child; # suppress output kill $SIGUSR1, $child; # suppress output
$rv = &prinput($_); $rv = &prinput($_);
kill $SIGUSR2, $child; # resume output kill $SIGUSR2, $child; # resume output
@@ -8128,32 +8136,7 @@ sub updatecheck {
my $latest_version = ''; my $latest_version = '';
if ($termrl && $termrl->ReadLine eq 'Term::ReadLine::TTYverse') { # Term::ReadLine::Gnu doesn't need version checking - it's maintained on CPAN
my $trlv = $termrl->Version;
print $stdout
"-- checking Term::ReadLine::TTYverse version: $vrlcheck_url\n";
$vvs = `$simple_agent $vrlcheck_url`;
print $stdout "-- server response: $vvs\n" if ($verbose);
($vvs, $s1, $s2, $s3) = split(/--__--\n/s, $vvs);
$s1 = undef if ($s1 !~ /^\*/) ;
$s2 = undef if ($s2 !~ /^\*/) ;
$s3 = undef if ($s3 !~ /^\*/) ;
chomp($vvs);
# right now we're only using $inversion (no betas/rcs).
($tverify, $inversion, $bversion, $rcnum, $download,
$bdownload) = split(/;/, $vvs, 6);
if ($tverify ne 'trlt') {
$vs .= "-- warning: unable to verify Term::ReadLine::TTYverse version\n";
} else {
if ($trlv < 0+$inversion) {
$vs .= "** NEW Term::ReadLine::TTYverse VERSION AVAILABLE: $inversion **\n" .
"** GET IT: $download\n";
$update_trlt = $download;
} else {
$vs .= "-- your version of Term::ReadLine::TTYverse is up to date ($trlv)\n";
}
}
}
print $stdout "-- checking TTYverse version...\n"; print $stdout "-- checking TTYverse version...\n";
# Git-based version checking - no longer using remote URL # Git-based version checking - no longer using remote URL