【问题标题】:Rakudo Perl 6: clear screen while using Readline moduleRakudo Perl 6:使用 Readline 模块时清除屏幕
【发布时间】:2018-06-12 23:40:16
【问题描述】:

这是我的测试程序:

use Readline;

shell 'clear';
my $r = Readline.new;

loop {
  my $a = $r.readline("> ");
  {say ''; last} if not defined $a;
  $r.add-history( $a );
  say $a;
}

输入任何字符串后,它会退出并显示以下消息:

> abc
Internal error: unhandled encoding
  in method CALL-ME at /opt/rakudo-pkg/share/perl6/sources/24DD121B5B4774C04A7084827BFAD92199756E03 (NativeCall) line 587
  in method readline at /home/evb/.perl6/sources/D8BAC826F02BBAA2CCDEFC8B60D90C2AF8713C3F (Readline) line 1391
  in block <unit> at abc.p6 line 7

如果我评论 shell 'clear'; 行,一切正常。

【问题讨论】:

    标签: raku rakudo


    【解决方案1】:

    这有点猜测,但我认为当你告诉你的shell clear 屏幕时,它会发送一个控制字符或控制序列作为终端仿真器的输入。 Readline 正在从同一个流中读取,当您尝试读取一行时,这些字符最终会出现在“行”的开头。这些字符不是有效的 UTF-8(默认编码),因此不能解释为字符串。如果您打开堆栈跟踪中的文本文件并查看相关的行号,您将了解更多信息。

    您可以尝试致电reset-terminalreset-line-state 看看是否可以摆脱该角色。我会在低级编程语言中做的是对输入进行非阻塞读取(不将其转换为字符串),但我在 Perl 6 库中找不到相应的 API。

    【讨论】:

    • 谢谢!我找不到reset-terminalreset-line-state,但只需添加shell 'reset' 即可解决问题。
    • Linenoise 没有这样的问题,但 Readline 好多了...
    • @EugeneBarsky 我很高兴这有效!我在 Readline.pm 代码中找到了这些函数,但实际上并没有尝试运行它。 github.com/drforr/perl6-readline/blob/master/lib/Readline.pm
    • 你是对的,bash shell 'printf "\033c"';shell 'clear' 做同样的工作(并且也禁用了 Readline)。
    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 2011-08-02
    • 2012-03-10
    • 2013-06-24
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多