Perl의 용어 :: shell에서 탭 완료를 사용자 정의하려면 어떻게해야합니까?

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

  •  19-09-2019
  •  | 
  •  

문제

나는 사용 중입니다 용어 :: 쉘 CLI 도구를 구현하는 패키지. 이 패키지는 API를 제공합니다. comp_CMD.

이 기능은 사용자가 탭을 누를 때마다 호출됩니다. 여기서 내 요구 사항은 다음과 같습니다.

shell> stack

over under

`쉘> 스택 오버

flow sample junk

그러나 기본값 comp_CMD 같은 탭 옵션 세트 만 제공합니다

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

다른 팁

여기에 추가하고 싶은 한 가지 더 ..

rl_complete 서브 루틴을 재정의 한 후, 우리는 또한 하위 명령의 반복 인쇄를 피하기 위해 comp__ (기본 서브 루틴이 탭을 요구하는 기본 서브 루틴)를 무시해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top