2009-07-24 47 views
3

我正在使用Term::Shell包來實現CLI工具。該軟件包提供了一個API:comp_CMD如何在Perl的Term :: Shell中自定義選項卡完成?

無論何時用戶按下TAB,都會調用此函數。 這裏我的要求是:

shell> stackTAB

over under

'外殼>堆在TAB

flow sample junk

但默認comp_CMD僅提供一組TAB的選項如

shell> stackTAB

over under

`殼>堆棧超過TAB

over under ###的問題是該處

代替超過下在這裏,我想獲得流量樣本垃圾

+0

好吧,現在我已經看了Term :: Shell,我注意到你需要寫'sub comp_stack`。我錯了嗎?你的`comp_stack`中有什麼? – 2009-07-24 13:13:26

回答

3

使用comp_*樣式處理程序,人們只能匹配一個完成對最後一個不完整的單詞。幸運的是,您可以通過覆蓋下面的catch_comp函數來獲得所需的結果;它可以讓抗全命令行一場比賽:

my %completion_tree = (
    stack => { under => [], 
       over => [qw(flow sample junk)] } 
); 

sub catch_comp { 
    my $o = shift; 
    my ($cmd, $word, $line, $start) = @_; 

    my $completed = substr $line, 0, $start; 
    $completed =~ s/^\s*//; 

    my $tree = \%completion_tree; 
    foreach (split m'\s+', $completed) { 
     last if ref($tree) ne 'HASH'; 
     $tree = $tree->{$_}; 
    } 

    my @completions; 
    $_ = ref($tree); 
    @completions =  @$tree if /ARRAY/; 
    @completions = keys %$tree if /HASH/; 
    @completions =  ($tree)if /SCALAR/; 

    return $o->completions($word, [@completions]); 
} 
+0

感謝Inshalla ...我是Perl的新手..我已經複製了我的代碼到我的..現在的問題是我不知道應該在示例代碼中做什麼改變,並得到預期的輸出..對不起,如果我是要求太多..你能爲我寫出comp_CMD模塊嗎?.. – Anandan 2009-07-26 05:20:05

0

還有一兩件事,我想在這裏補充..

覆蓋rl_complete子程序後,我們還必須覆蓋comp__(要求選項卡的默認子程序),以避免重複打印子命令。