バッシュ完了 `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アーカイブは完了しましたか?これは、ファイルが□の前にゼロのある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ローカライズもしてみてください。

おすすめ記事