Bash 完成 `unrar`

Bash 完成 `unrar`

bash-completion加载时,unrar x按 Tab 键转到目录中的 RAR 存档后完成。

但对于具有新命名约定的多部分档案,例如

文件名.part01.rar
文件名.part02.rar
文件名.part03.rar

它看不到以 结尾的第一个存档之间有任何区别.part1.rar.part01.rar或者.part001.rar与所有其他部分(例如.part02.rar从未直接打开的部分)之间没有任何区别,它完成了它们全部

是否可以配置 bash-completion 以便仅第一部分多部分 RAR 存档已完成?这意味着文件以 □ 为大于 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修复零件存在导致正常文件无法显示的问题。 (整个 glob 是..不可读的。)

现在您也需要复制该if ((cmp_parts))部分。另外,cmp_parts本地化。

相关内容