Perl の Term::Shell でタブ補完をカスタマイズするにはどうすればよいですか?
-
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 で呼び出されるデフォルトのサブルーチン) もオーバーライドする必要があります。
所属していません StackOverflow