【问题标题】:perl6 Is there a way to do editable prompt input?perl6 有没有办法进行可编辑的提示输入?
【发布时间】:2017-08-19 08:37:06
【问题描述】:

在 bash shell 中,如果您按向上或向下箭头,shell 将显示您输入的上一个或下一个命令,您可以将这些命令编辑为新的 shell 命令。

在 perl6 中,如果你这样做了

my $name = prompt("Enter name: ");

它会打印“输入姓名:”然后要求输入;有没有办法让 perl6 给你一个默认值,然后你只需将默认值编辑为新值。例如:

my $name = prompt("Your name:", "John Doe");

它会打印出来

Your name: John Doe

其中 John Doe 部分是可编辑的,当您按 Enter 时,编辑后的字符串是 $name 的值。

https://docs.raku.org/routine/prompt 没有说明如何操作。

如果您必须输入许多长字符串,每个字符串都只有几个字符不同,这很有用。

谢谢。

【问题讨论】:

    标签: input default prompt raku


    【解决方案1】:

    要进行编辑部分,您可以使用 Linenoise 模块:

    zef install Linenoise
    

    (https://github.com/hoelzro/p6-linenoise)

    然后,在您的代码中,执行:

    use Linenoise;
    sub prompt($p) {
        my $l = linenoise $p;
        linenoiseHistoryAdd($l);
        $l
    }
    

    然后,您可以在提示下执行循环。请记住,基本上所有 Perl 6 内置函数都可以在词法上被覆盖。现在,如何填写原始字符串,我还没有弄清楚。也许 libreadline 文档可以帮助您。

    【讨论】:

    • 非常感谢您,伊丽莎白·马蒂森!我会检查线路噪音。
    【解决方案2】:

    另一种解决方案:

    使用io-prompt 有了它,您可以设置默认值甚至默认类型:

    my $a = ask( "Life, the universe and everything?", 42, type => Num );
    Life, the universe and everything? [42]
    Int $a = 42
    

    你可以安装它:

    zef install IO::Prompt
    

    但是,如果只是一个默认值是不够的。那么最好使用 Liz 建议的方法。

    【讨论】:

    • 谢谢 Wolf 和 LuFFy,我会检查 IO::Prompt !!
    【解决方案3】:

    默认情况下,程序完全不知道它们的终端。
    您需要您的程序与终端通信以执行诸如预填充输入行之类的操作,而期望 Perl 6 将此类事情作为核心语言的一部分来处理是不合理的。

    也就是说,只要您有兼容的终端,您的确切情况将由 Readline 库处理。

    不幸的是,perl 6 Readline 似乎没有预输入挂钩设置,因此您需要自己处理回调和读取循环。这是我的粗略尝试,完全符合您的要求:

    use v6;
    use Readline;
    
    sub prompt-prefill($question, $suggestion) {
      my $rl = Readline.new;
      my $answer;
      my sub line-handler( Str $line ) {
        rl_callback_handler_remove();
        $answer = $line;
      }
    
      rl_callback_handler_install( "$question ", &line-handler );
    
      $rl.insert-text($suggestion);
      $rl.redisplay;
      while (!$answer) {
        $rl.callback-read-char();
      }
    
      return $answer;
    }
    
    
    my $name = prompt-prefill("What's your name?", "Bob");
    say "Hi $name. Go away.";
    

    如果您仍坚持使用Linenoise,您可能会发现“提示”功能足以满足您的需求(如果您想要演示,redis-cli 应用程序会广泛使用它)。请参阅the linenoise example.c file 中与linenoiseSetHintsCallback 一起使用的hint 回调。如果这还不够好,您将不得不开始深入挖掘线路噪声。

    【讨论】:

    • 谢谢 Timbus!我会检查 Readline 和你的代码!!
    • 没问题。但我应该提一下,我今天无法在我的机器上安装 Readline。结果是最近的一个更改破坏了安装,但在修复之前有一个解决方法:github.com/ugexe/zef/issues/148#issuecomment-289458725
    猜你喜欢
    • 2021-09-09
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多