2017-03-26 114 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 –

相關問題