コードレビュー:bashエイリアスのオートコンプリート

コードレビュー:bashエイリアスのオートコンプリート

私が読んでいるコマンドエイリアスのbashの完成を取得するには?Shawn J. Goffの答えには何かが必要だと思います。ユーザー設定を減らして、自分の設定からインポートするように設計された小さなスクリプトを作成しましたが、うまく機能しないので、.bashrc誰かが私の間違いに気付くことを願っています。

function make-completion-wrapper-1 () {
    local function_name="$2"
    local arg_count=$(($#-3))
    local comp_function_name="$(complete -pr $1|sed -e 's/^\(.* -F \)\([^ ]*\) [^ ]*$/\2/')"
    shift 2
    local function="
        function $function_name {
            ((COMP_CWORD+=$arg_count))
            COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
            "$comp_function_name"
            return 0
        }"
    echo "$function"
    eval "$function"
}

function make-completion-wrapper-2 () {
    local function_name="$1"
    local alias_name="$2"
    local comp_function_base="$(complete -pr $3|sed -e 's/^\(.* -F\)\( [^ ]*\) [^ ]*$/\1/')"
    echo "$comp_function_base $function_name $alias_name"
    eval "$comp_function_base $function_name $alias_name"
}

[ -e ~/.cache/bash_alias_complete ] && rm ~/.cache/bash_alias_complete

alias | \
    sed \
        -e 's/^alias //' \
        -e '/^\([^=]\+\)='\''\1 /d' \
        -e "/'.*=/d" -e '/\$/d' \
        -e h \
        -e "s/.*='\([^ ]*\)\( .*\)'$/\1! \1\2/" \
        -e 'y/ -!/__ /' -eG -e 's!\n[^=]*='\''\(.*\)'\''! \1!' \
        -e 's/^/make-completion-wrapper-1 /p' \
        -e 's/^[^ ]* [^ ]* \([^ ]*\) .*$/\1/' \
        -e x \
        -e 's!='\''\([^ ]*\) .*$! \1!' \
        -e x \
        -e 's!^!make-completion-wrapper-2 !' \
        -e G \
        -e 'y/\n/ /' \
    > ~/.cache/bash_alias_complete

. ~/.cache/bash_alias_complete

キーを押すと、次のエラーが発生しますTab

bash: COMP_POINT - : syntax error: operand expected (error token is "- ")

メモ:上記のコードはファイル(例えば)に置くことができmyfuncs.bash、その後シェルまたは$HOME/.bashrc

このコードの完全な変更履歴については、以下を参照してください。https://github.com/hildred/scripts.git

ベストアンサー1

エラーメッセージ COMP_POINT のソースは次のとおりです。バッシュリファレンスマニュアル:

COMP_POINT

現在のコマンドの先頭に基づく現在のカーソル位置のインデックス。現在のカーソル位置が現在のコマンドの最後にある場合、この変数の値は ${#COMP_LINE} と同じです。この変数は、プログラマブルコンプリートによって呼び出されるシェル関数と外部コマンドでのみ使用できます(プログラム可能コンプリートを参照)。

この試み

あなたのコードをそのまま使用しようとしています。最後の行まですべてを調達するのに効果的です。この行を実行すると. ~/.cache/bash_alias_completeエラーが発生します。ここに含めるには多すぎます。

結果をファイルとして生成する際にいくつかの問題があるようです~/.cache/bash_alias_complete

私が経験したエラー

次のエイリアスがあります。

$ alias|grep cdc
alias cdl='cdctl -o1'
alias cdu='cdctl -o0'

あなたのsedコマンドを介してそのコマンドが通過し、私のキャッシュファイルに伝播され、これらのコマンドは次のエラーを引き起こします。

$ make-completion-wrapper-1 cdctl _cdctl__o1 cdctl -o1
$ make-completion-wrapper-2 _cdctl__o1 cdl cdctl
$ make-completion-wrapper-1 cdctl _cdctl__o0 cdctl -o0
$ make-completion-wrapper-2 _cdctl__o0 cdu cdctl
bash: complete: cdctl: no completion specification
 _cdctl__o1 cdl

他の例もありますが、要点は、コマンドがsed必要なほど厳密ではないということです。これが最終的に問題です。

おすすめ記事