Bash의 모든 디렉터리에 있는 "~/bin/*" 파일 이름에 대한 명령 매개변수 완성

Bash의 모든 디렉터리에 있는 "~/bin/*" 파일 이름에 대한 명령 매개변수 완성

Bash의 기본 기능은 현재 작업 디렉터리에 관계없이 다양한 bin 디렉터리에 저장된 명령을 완료하는 것입니다. 이를 통해 사용자는 실행해야 하는 디렉터리의 전체 경로를 지정하지 않고도 명령과 바이너리를 체계적으로 유지할 수 있습니다.

Bash는 나보다 먼저 이 명령 완성을 어떻게 제공했습니까?달리기내 생각에 디자인 관점에서 이러한 bin 파일은 내가 실행하기 전에 동일한 명령 완료를 기대하는 것이 합리적이라고 생각합니다.편집하다그들을.

내 특별한 경우에는 이는 내 편집기의 완성 기능을 수정하여 vi현재 작업 디렉터리의 파일 이름뿐만 아니라 내 파일 이름도 포함하도록 의미합니다 ~/bin/(실제로 다른 컨테이너의 파일을 추가하는 것에 대해서는 신경 쓰지 않습니다. 명령).

간단한 수정이것그래서 대답은 이렇습니다.

$ source _vi 
$ complete -f -F _vi vi

여기서 _vi는 다음과 같이 정의됩니다.

_vi () 
{
    local word=${COMP_WORDS[COMP_CWORD]};
    local pat="~/bin/*"

    COMPREPLY=($(compgen -f -G "$pat" -- "~/bin/${word}"));

    i=0
    for item in "${COMPREPLY[@]}"; do
        COMPREPLY[$i]="${item##*/}"
        i+=1
    done;
    return 0;
}

하지만 vi는 파일을 열려면 전체 경로를 전달해야 합니다!

그래서 내 질문은: 내가 어떻게 할 수 있습니까?탭 완료파일 이름은 다음에서 왔지만 ~/bin/여전히통과전체 경로 vi? 이건 그냥 |꿈인가요? 완전히 다른 접근 방식을 시도해야 할까요?

~/bin/*제가 사용할 때는 vi (TAB)(TAB)!

편집하다:

@roaima의 답변과 아래에 설명된 제안 사항을 기반으로 제가 사용하는 기능은 다음과 같습니다. 내가 관심 있는 두 디렉터리(바이너리 및 구성 파일) 이외의 디렉터리에 있는 파일에 디렉터리 독립적 완성 액세스를 쉽게 추가할 수 있습니다.

_vi () 
{
    local word=${COMP_WORDS[COMP_CWORD]};
    local bin_dir="~/bin/"
    local dot_dir="~/dotfiles/"

    COMPREPLY=($(compgen -f -G "$bin_dir*" -- "$bin_dir${word}"));
    COMPREPLY+=($(compgen -f -G "$dot_dir*" -- "$dot_dir${word}"));
    return 0;
}

답변1

가장 쉬운 방법은 $item다음에 경로를 추가할 때 경로를 제거 하지 않는 것입니다 $COMPREPLY[$i].

_vi () 
{
    local word=${COMP_WORDS[COMP_CWORD]};
    local pat="~/bin/*"

    COMPREPLY=($(compgen -f -G "$pat" -- "~/bin/${word}"));
    return 0;
}

가능한 목록은 경로 구성 요소 없이 표시되지만 성공적으로 완료되면 경로가 삽입됩니다.

대안은 현재 디렉토리에서 파일 이름을 찾는 쉘 스크립트를 사용하여 자체적으로 확장하는 것입니다 . 파일 이름 이 vi없으면 . 검색하기 /.~/bin/$CDPATH~/bin

관련 정보