bash-completion
로딩이 unrar x
완료되면 Tab 키를 눌러 RAR 아카이브의 디렉터리로 이동합니다.
그러나 새로운 명명 규칙을 사용하는 다중 부분 아카이브의 경우, 예를 들어
파일 이름.part01.rar
파일 이름.part02.rar
파일 이름.part03.rar
로 끝나는 첫 번째 아카이브 또는 다른 모든 부분(예: 직접 열리지 않은 부분)과의 차이점을 확인하지 .part1.rar
않고 완료 합니다 .part01.rar
..part001.rar
.part02.rar
모두.
bash-completion을 구성하여 다음과 같이만 구성할 수 있습니까?첫 번째 부분멀티파트 RAR 아카이브가 완료되었나요? 이는 파일이 □ 앞에 0이 있는 1보다 큰 숫자(예: 2, 02 또는 002)로 끝나지만 .rar
?로 끝나지 않음을 의미합니다..part□.rar
다음은 나를 위해 일했습니다. 이 말이 100% 맞는지는 모르겠습니다.
# unrar(1) completion -*- shell-script -*-
_unrar()
{
local cur prev words cword cmp_opts=1 i
_init_completion || return
# Check if all of the middle part are options.
# If not, we break at the last-option idx, and won't complete opts.
for ((i=1; i<${#words[@]}-1; i++)); do
# not using the whole list for checking -- too verbose
if [[ ${words[i]} != -* || ${words[i]} == '--' ]]; then
cmp_opts=0
break
fi
done
if [[ $cur == -* ]] && ((cmp_opts)); then # options
COMPREPLY=( $( compgen -W '-ad -ap -av- -c- -cfg- -cl -cu -dh -ep -f
-idp -ierr -inul -kb -o+ -o- -ow -p -p- -r -ta -tb -tn -to -u -v
-ver -vp -x -x@ -y' -- "$cur" ) )
elif ((cword == 1)); then # command
COMPREPLY=( $( compgen -W 'e l lb lt p t v vb vt x' -- "$cur" ) )
elif ((cword == i+1)); then # archive
_filedir '[rR][aA][rR]'
# If there is a second, third, ... ninth part
for i in "${COMPREPLY[@]}"; do
if [[ $i == *.part*(0)[2-9].[rR][aA][rR] ]]; then
# Only look for the first, since it's the only useful one
COMPREPLY=()
_filedir 'part*(0)1.[rR][aA][rR]'
break
fi
done
else # files.../path...
_filedir
fi
} &&
complete -F _unrar unrar
# ex: ts=4 sw=4 et filetype=sh
답변1
보고 있다https://github.com/scop/bash-completion/pull/12/files이 필터링을 수행하는 방법을 알아보세요.
COMPREPLY[]
기본적으로 잘못된 완성을 제거하려면 어떤 방식으로든 사후 처리가 필요합니다 . 래퍼를 추가할 수도 있습니다.
_mycomp_unrar(){
local i
_unrar "${[@]}" # use the old one
# now copy the for i in "${COMPREPLY[]}" stuff
} &&
complete -p rar # remove old completion
complete -F _mycomp_unrar # use your good new one
또는 (위에 표시된 대로) 끌어오기 요청을 보내고 무슨 일이 일어나는지 확인할 수 있습니다.
제출물이 추가되었습니다.https://github.com/Arthur2e5/bash-completion-1/commit/a586ede일반 파일이 표시되지 않는 부분의 문제를 수정했습니다. (전체 글로브는...읽을 수 없습니다.)
if ((cmp_parts))
이제 해당 섹션도 복사해야 합니다 . 또한 cmp_parts
현지화도 해보세요.