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))'))
}