2017-03-26 71 views
2

在bash shell中,如果您点击向上或向下箭头,shell会显示您输入的上一个或下一个命令,并且可以将这些命令编辑为新的shell命令。perl6有没有办法做可编辑的提示输入?

在perl6,如果你这样做

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

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

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

和它打印

Your name: John Doe 

在李四的部分是可编辑的,而当你按下回车键,在编辑字符串为$ name的值。

https://docs.perl6.org/routine/prompt不显示如何操作。

这很有用,如果你必须输入很多长字符串,每个字符串只是几个不同于其他字符的字符串。

谢谢。

回答

3

为了让编辑部去,你可以使用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文档可以帮助你。

+0

非常感谢Elizabeth Mattijsen!我会检查一下linenoise。 – lisprogtor

0

另一种解决方案:

使用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建议的方法。

+0

谢谢Wolf和LuFFy,我会查看IO :: Prompt !! – lisprogtor

1

那么默认情况下,程序完全不知道他们的终端。
您需要您的程序与终端进行通信以完成预填充输入行等操作,并且期望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广泛使用应用程序,如果你想演示)。请参阅linenoiseSetHintsCallbackthe linenoise example.c file中使用的hint回调。如果这还不够好,你将不得不开始深入探讨linenoise的内涵。

+0

谢谢Timbus!我会检查出Readline和你的代码! – lisprogtor

+0

没问题。但我应该提到,我今天无法在我的机器上安装Readline。原来最近的一次更改打破了安装,但是有一个解决方法,直到它被修复:https://github.com/ugexe/zef/issues/148#issuecomment-289458725 –

相关问题