2009-07-24 10 views
3

Ich verwende Term::Shell Paket, um ein CLI-Tool zu implementieren. Dieses Paket bietet eine API: comp_CMD.Wie kann ich die Tabulatorvervollständigung in Perls Term :: Shell anpassen?

Diese Funktion wird aufgerufen, wenn der Benutzer die TAB-Taste drückt. Meine Forderung ist hier:

shell> stackTAB

over under

`shell> Stapel über TAB

flow sample junk

Aber die Standard-comp_CMD bietet nur einen Satz von TAB Optionen wie

shell> stackTAB

over under

`shell> Stapel über TAB

over under ### Das Problem ist hier

Statt über unter hier möchte ich flussmuster junk bekommen.

+0

Nun, nachdem ich Term :: Shell betrachtet habe, merke ich, dass Sie 'sub comp_stack' schreiben müssen. Liege ich falsch? Was ist in deinem 'comp_stack'? –

Antwort

3

Mit den Style-Handlern comp_* kann man nur die Vervollständigungen mit dem letzten unvollständigen Wort abgleichen. Glücklicherweise können Sie jedoch das gewünschte Ergebnis erzielen, indem Sie die Funktion catch_comp wie folgt überschreiben: es lässt ein Match gegen ganze Befehlszeile:

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

danke Inshalla ... Ich bin ein Neuling zu Perl .. Ich habe ur-Code in meine kopiert .. Jetzt ist das Problem, ich weiß nicht, welche Änderungen sollte ich in Beispielcode machen und die erwartete Ausgabe .. Entschuldigung, wenn ich bin frage nach zu viel .. Kannst du einfach das comp_CMD-Modul für mich schreiben? .. – Anandan

+0

Sie können einfach kopieren Sie die Funktion oben, wie es ist, ohne Änderungen. Nur der $ completion_tree muss geändert werden. Wenn die Syntax Ihnen Probleme gibt, schauen Sie sich http://perldoc.perl.org/perldata.html an. Es sollte eigentlich ziemlich offensichtlich sein, wie man es ändert, da das obige Beispiel genau die Art der Vervollständigung darstellt, die Sie erwarten; Ändere einfach "stack" zu dem, was dein Befehl ist; "Unter" und "Über" sind Ihre ersten Parameter; "Flow" usw. sind zweite Parameter, aber nur verfügbar, wenn "over" der erste ist. Sie können den Baum beliebig vergrößern. – Inshallah

+0

kann ich das jetzt benutzen .. Vielen Dank Inshalla :) :) – Anandan

0

Eine weitere Sache, die ich hier hinzufügen möchten ..

Nach zwingende rl_complete Unterprogramm, müssen wir auch comp__ (Standard-Unterprogramm für TAB genannt) außer Kraft zu vermeiden wiederholtes Drucken der Unterbefehle.

Verwandte Themen