2017-03-26 3 views
2

Wenn Sie in der Bash-Shell Pfeile nach oben oder unten drücken, zeigt die Shell Ihren vorherigen oder nächsten Befehl, den Sie eingegeben haben, und Sie können diese Befehle als neue Shell-Befehle bearbeiten.perl6 Gibt es eine Möglichkeit, editierbare Eingabeaufforderung zu machen?

In Perl6, wenn Sie das tun

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

es wird "Geben Sie den Namen:" drucken und dann zur Eingabe fragen; Gibt es eine Möglichkeit, perl6 einen Standardwert zu erhalten und dann einfach den Standardwert als neuen Wert zu bearbeiten. Z.B .:

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

und er druckt

Your name: John Doe 

wo der John Doe Teil bearbeitet werden kann, und wenn Sie die Eingabetaste drücken, wird die bearbeitete Zeichenfolge der Wert des Namen $.

https://docs.perl6.org/routine/prompt zeigt nicht, wie es geht.

Dies ist nützlich, wenn Sie viele lange Strings eingeben müssen, von denen jeder nur ein paar Zeichen von anderen Zeichen unterscheidet.

Danke.

Antwort

3

die Bearbeitung Teil gehend zu erhalten, können Sie das Linenoise Modul verwenden:

zef install Linenoise 

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

Dann in Ihrem Code, tun:

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

Dann können Sie Mach deine Schleife mit der Eingabeaufforderung. Denken Sie daran, dass grundsätzlich alle eingebauten Funktionen von Perl 6 lexikalisch überschrieben werden können. Nun, wie fülle ich die ursprüngliche Saite aus, die ich noch nicht herausgefunden habe. Vielleicht können Ihnen die Libreadline-Dokumente dabei helfen.

+0

Vielen Dank, Elizabeth Mattijsen !!! Ich werde Lineoise überprüfen. – lisprogtor

0

Eine andere Lösung:

Verwenden io-prompt Damit Sie einen Standardwert festlegen können und sogar einen Standardtyp:

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

Sie es mit installieren können: Allerdings

zef install IO::Prompt 

, wenn nur ein Standardwert nicht ausreicht. Dann ist es besser, wenn Sie den Ansatz verwenden, den Liz vorgeschlagen hat.

+0

Danke Wolf und LuFFy, ich werde IO :: Prompt !! – lisprogtor

1

Nun, Programme sind sich ihrer Terminals normalerweise nicht bewusst.
Sie benötigen Ihr Programm, um mit dem Terminal zu kommunizieren, um Dinge wie das Vorfüllen einer Eingabezeile auszuführen, und es ist unangemessen zu erwarten, dass Perl 6 so etwas als Teil der Kernsprache behandelt.

Das heißt, Ihr genauer Fall wird von der Readline Bibliothek behandelt, solange Sie ein kompatibles Terminal haben.

Es sieht nicht so aus, als hätte der Perl 6 Readline Pre-Input Hooks Setup, so dass Sie leider selbst mit dem Callback und der Read-Loop umgehen müssen.Hier ist mein grober Versuch, das genau das tut, was Sie wollen:

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

Wenn Sie noch auf der Verwendung Linenoise festgelegt sind, finden Sie vielleicht die Funktion ‚Hinweise‘ gut genug für Ihre Bedürfnisse (es verwendet werden weitgehend durch die redis-cli Anwendung, wenn Sie eine Demo wünschen). Siehe hint Rückruf, der mit linenoiseSetHintsCallback in the linenoise example.c file verwendet wird. Wenn das nicht gut genug ist, müssen Sie anfangen, in den Mut von Linenoise zu graben.

+0

Danke Timbus! Ich werde Readline und deine Codes lesen !! – lisprogtor

+0

Kein Problem. Aber ich sollte erwähnen, dass ich Readline heute nicht auf meinem Rechner installieren konnte. Stellt sich heraus, eine sehr aktuelle Änderung brach die Installation, aber es gibt einen Workaround, bis es behoben ist: https://github.com/ugexe/zef/issues/148#issuecomment-289458725 –

Verwandte Themen