Bash 완성 - 하위 옵션에 대한 파일 이름 완성을 얻는 방법

Bash 완성 - 하위 옵션에 대한 파일 이름 완성을 얻는 방법

주 매개변수와 하위 매개변수를 받아들이는 함수가 있습니다. 하위 매개변수 중 일부는 파일 이름입니다. 현재 완성된 코드는 다음과 같습니다.

_scm() {
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(mpv -input cmdlist | awk '{print $1}')

    case "${prev}" in
        sub_add)
            COMPREPLY=( $(compgen -f ${cur}) )
            return 0
            ;;
        *)
            ;;
    esac

    COMPREPLY=( $(compgen -W "${opts}" -- ${cur} ) )
}
complete -o plusdirs -F _scm scm

나는 sub_addarg가 파일 이름을 subarg로 갖기를 원하며 현재 코드는 그렇게 할 수 있습니다. 그러나 sub_addaubargs가 완료 되면 args에 대한 자동 완성 기능도 다시 얻고 싶습니다 . 하지만 파일 완성이 계속 발생합니다.

예를 들어, 이제 다음을 누르십시오.

scm sub_add <TAB>

파일 이름을 완성해 보겠습니다. 또한 내가 원하는 것은 파일 이름을 완성한 후 원래 인수 완성이 시작되어야 한다는 것입니다.

scm sub_add ~/filename.txt <TAB>

sub_add sub_load seek....기다려야 한다

파일 이름 완성이 계속해서 발생하는 이유는 complete -o plusdirs. 원하는 것을 달성하기 위해 코드를 어떻게 수정합니까?

답변1

나는 파일 이름만 완성할 수 있는 내장 또는 bash 완성 표준 기능이 없다고 생각합니다. 디렉토리에는 파일이 포함될 수 있으므로 파일 이름을 완성하는 표준 동작은 파일과 디렉토리를 모두 완성하는 것입니다(bash-completion이 수행하는 것과 같습니다 _filedir. 파일에서만 작동하는 것이 아니라 디렉토리에서만 작동하는 옵션이 있습니다).

completions=( "$word"* )예를 들어 반복 및 [[ -f "$i" ]]빌드 확인 과 같은 파일 이름 일치만 반환하는 사용자 정의 함수를 작성할 수 있습니다 COMPREPLY.

귀하의 코드를 더주의 깊게 읽었습니다. 완료를 생성하는 경우유틸리티 차량, 현재 디렉터리의 기본 파일 이름에만 적용되도록 제한해서는 안 됩니다. 이것은 내가 아는 다른 사용자 정의 완성 기능이 작동하는 방식이 아닙니다.

관련 정보