주 매개변수와 하위 매개변수를 받아들이는 함수가 있습니다. 하위 매개변수 중 일부는 파일 이름입니다. 현재 완성된 코드는 다음과 같습니다.
_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_add
arg가 파일 이름을 subarg로 갖기를 원하며 현재 코드는 그렇게 할 수 있습니다. 그러나 sub_add
aubargs가 완료 되면 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
.
귀하의 코드를 더주의 깊게 읽었습니다. 완료를 생성하는 경우유틸리티 차량, 현재 디렉터리의 기본 파일 이름에만 적용되도록 제한해서는 안 됩니다. 이것은 내가 아는 다른 사용자 정의 완성 기능이 작동하는 방식이 아닙니다.