bash에서 compgen을 사용하여 대소문자를 구분하지 않고 완성하기

bash에서 compgen을 사용하여 대소문자를 구분하지 않고 완성하기

bash(devmode2)를 사용하여 명령을 자동 완성하려고 합니다.복합 Gene-W, 내 bashrc에는 다음이 있습니다.

_devmode2() {
    COMPREPLY=()
    local sonames=$(devmode2 --auto --current "${COMP_CWORD}" -- ${COMP_WORDS[@]})
    COMPREPLY=($(compgen -W "${sonames}" -- ${COMP_WORDS[COMP_CWORD]}))
}
complete -F _devmode2 devmode2

자동완성 예시

$ devmode2 g<tab>

밝혀지다소네임다음 값을 사용합니다.

game-life-adv
game-life-sparse
getopt-alt
git-workflow
git-workflow-extra
github-testers
group-git
group-git-ivan
Group-Git-Taggers-Maven
Group-Git-Taggers-Node
Group-Git-Taggers-Perl
Group-Git-Taggers-Ruby

하지만 내 자동 완성에서는 다음과 같은 제안이 생성됩니다.

game-life-adv       game-life-sparse    getopt-alt          github-testers      git-workflow        git-workflow-extra  group-git           group-git-ivan

내가 전달한 모든 값을 어떻게 얻을 수 있습니까?캠프겐물러나 다?

답변1

내가 아는 한, compgen제공하는 옵션 목록에서 대소문자를 구분하지 않고 필터링하는 옵션은 없습니다.

readline파일 이름 완성에서 대소문자를 구분하지 않도록 변수를 설정할 수 있습니다 .

bind "set completion-ignore-case on"

그러나 이는 동작에 영향을 미치지 않으므로 compgen프로그래밍 가능한 완성 기능에서는 작동하지 않을 수 있습니다. (파일 이름에도 약간 이상하게 동작합니다.)

compgen이를 통해 를 사용하는 대신 (또는 필터링 이외의 기능이 필요한 경우와 함께 사용하여) 자체 필터링을 수행할 수 있습니다 compgen. 이는 귀하의 예에는 해당되지 않습니다.

간단히 대체 목록을 반복하고 대소문자를 구분하지 않는 접두사 비교를 수행하여 이 작업을 수행할 수 있지만 다음과 같은 작은 함수가 작동합니다.

_devmode2() {
  local sonames=($(devmode2 --auto --current "${COMP_CWORD}" -- ${COMP_WORDS[@]}))
  local prefix="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=($(printf %s\\n "${sonames[@]}" |
               awk -v IGNORECASE=1 -v p="$prefix" \
                   'p==substr($0,0,length(p))'))
}

devmode2한 줄에 하나의 대체 항목을 출력 하면 입력으로 사용하는 것이 더 쉬울 것입니다 awk. 또한, 제가 아는 한, 완성 함수의 두 번째 매개변수는 항상 ${COMP_WORDS[COMP_CWORD]}. 따라서 이것은 더 간단할 수 있습니다.

_devmode2() {
  COMPREPLY=($(devmode2 -auto --current "${COMP_CWORD}" -- "${COMP_WORDS[@]}" \
               awk -v IGNORECASE=1 -v p="$2" \
                   'p==substr($0,0,length(p))'))
}

관련 정보