2017-03-26 1 views
2

Dans shell bash, si vous appuyez sur les flèches haut et bas, le shell affiche la commande précédente ou suivante que vous avez entrée et vous pouvez modifier ces commandes pour qu'elles deviennent de nouvelles commandes shell.perl6 Y a-t-il un moyen de faire une saisie rapide modifiable?

En perl6, si vous

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

il imprimera "Entrez le nom:" puis demander l'entrée; est-il un moyen d'avoir perl6 vous donner une valeur par défaut, puis vous venez de modifier la valeur par défaut pour être la nouvelle valeur. .: par exemple

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

et imprime

Your name: John Doe 

où la partie John Doe est modifiable, et lorsque vous appuyez sur Entrée, la chaîne éditée est la valeur du nom $.

https://docs.perl6.org/routine/prompt ne montre pas comment le faire.

Ceci est utile si vous devez entrer de nombreuses chaînes longues dont chacune est composée de quelques caractères différents des autres.

Merci.

Répondre

3

Pour la partie de l'édition en cours, vous pouvez utiliser le module Linenoise:

zef install Linenoise 

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

Ensuite, dans votre code, faites:

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

Ensuite, vous pouvez Faites votre boucle avec invite. Rappelez-vous, fondamentalement, toutes les fonctions intégrées de Perl 6 peuvent être remplacées lexicalement. Maintenant, comment remplir la chaîne d'origine, que je n'ai pas encore compris. Peut-être que les docs de libreadline peuvent vous aider avec cela.

+0

Merci beaucoup, Elizabeth Mattijsen !!! Je vais vérifier linotte. – lisprogtor

0

Une autre solution:

Utilisez io-prompt Avec que vous pouvez définir une valeur par défaut et même un type par défaut:

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

Vous pouvez l'installer avec:

zef install IO::Prompt 

Cependant, si juste une valeur par défaut ne suffit pas. Alors il vaut mieux utiliser l'approche suggérée par Liz.

+0

Merci Wolf et LuFFy, je vais vérifier IO :: Invite !! – lisprogtor

1

Par défaut, les programmes ne connaissent pas leurs terminaux.
Vous avez besoin de votre programme pour communiquer avec le terminal, par exemple pour pré-remplir une ligne de saisie, et il est déraisonnable de s'attendre à ce que Perl 6 gère quelque chose comme ça dans le langage noyau. Cela dit, votre cas exact est traité par la bibliothèque Readline tant que vous avez un terminal compatible.

Il ne semble pas que perl 6 Readline ait une configuration de hook pré-entrée, donc vous devez gérer le callback et lire la boucle vous-même, malheureusement.Voici ma tentative grossière qui fait exactement ce que vous voulez:

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

Si vous êtes toujours défini sur l'utilisation Linenoise, vous trouverez peut-être la fonction « conseils » assez bon pour vos besoins (il est largement utilisé par le redis-cli application si vous voulez une démo). Voir le rappel hint utilisé avec linenoiseSetHintsCallback dans the linenoise example.c file. Si ce n'est pas assez, vous devrez commencer à creuser dans les boyaux de linotte.

+0

Merci Timbus! Je vais vérifier Readline et vos codes !! – lisprogtor

+0

Pas de problème. Mais je dois mentionner que je ne pouvais pas installer Readline sur ma machine aujourd'hui. Il s'avère qu'un changement très récent a cassé l'installation, mais il existe une solution de contournement jusqu'à ce qu'il soit résolu: https://github.com/ugexe/zef/issues/148#issuecomment-289458725 –