Perl の Term::Shell でタブ補完をカスタマイズするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1177227

  •  19-09-2019
  •  | 
  •  

質問

使っています 用語::シェル CLI ツールを実装するためのパッケージ。このパッケージは次の API を提供します。 comp_CMD.

この関数は、ユーザーが TAB を押すたびに呼び出されます。ここでの私の要件は次のとおりです。

shell> stackタブ

over under

`シェル>スタックオーバータブ

flow sample junk

しかし、デフォルトでは comp_CMD 次のような TAB オプションのセットが 1 つだけ提供されます。

shell> stack タブ

over under

`シェル>スタックオーバータブ

over under ### 問題はここにあります

の代わりに 上の下 ここで、私は取得したい フローサンプルジャンク.

役に立ちましたか?

解決

とともに 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]);
}

他のヒント

ここでもう 1 つ付け加えておきたいことがあります。

rl_complete サブルーチンをオーバーライドした後、サブコマンドの繰り返し出力を避けるために、comp__ (TAB で呼び出されるデフォルトのサブルーチン) もオーバーライドする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top