배쉬 완료 `unrar`

배쉬 완료 `unrar`

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현지화도 해보세요.

관련 정보