2017-03-26 8 views
2

bashシェルでは、上下矢印キーを押すと、入力した前または次のコマンドがシェルに表示され、それらのコマンドを編集して新しいシェルコマンドにすることができます。 「名前を入力します:」あなたはperl6編集可能なプロンプト入力を行う方法はありますか?

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

をすれば、それが印刷されます

Perl6ので

、その後、入力を求めます。 perl6にデフォルト値を与えて、デフォルト値を新しい値に編集する方法がありますか?例えば:

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

をし、それがジョン・ドウの一部が編集可能である、とあなたが入力した打ったとき、編集された文字列は、$ nameの値である

Your name: John Doe 

を印刷します。

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

ありがとう、エリザベス・マティジャン!私は寝椅子をチェックアウトします。 – 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 

、デフォルト値だけでは不十分な場合です。それでリズが提案したアプローチを使うのが良いです。

+0

狼とLuFFyありがとう、私はIO ::プロンプトをチェックアウトします! – lisprogtor

1

デフォルトでは、プログラムは端末を完全に認識しません。
入力行をあらかじめ入力するなどの目的で端末と通信するプログラムが必要です。また、Perl 6がコア言語の一部としてこのようなことを処理することは期待できません。

つまり、互換性のある端末を持っている限り、正確なケースはReadlineライブラリで処理されます。

Perl 6のReadlineにプリ入力フックが設定されていないように見えるので、残念なことにコールバックを処理してループを読む必要があります。ここで何をしたい正確に行い、私のラフな試みです:あなたはまだLinenoiseを使用して設定されている場合

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."; 

、あなたのニーズに十分に良い「ヒント」機能を見つけるかもしれないが(それはredis-cliによって広く使われていますデモが必要な場合はアプリケーション)。 the linenoise example.c filelinenoiseSetHintsCallbackで使用hintコールバックを参照してください。それが十分ではない場合、あなたはlinenoiseの根性に掘り始める必要があるでしょう。

+0

Timbusありがとうございました!私はReadlineとあなたのコードをチェックします! – lisprogtor

+0

問題ありません。しかし、今日私のマシンにReadlineをインストールすることはできませんでした。最近の変更がインストールを破ったことが判明しましたが、修正されるまで回避策があります:https://github.com/ugexe/zef/issues/148#issuecomment-289458725 –

関連する問題