私が読んでいるコマンドエイリアスの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
必要なほど厳密ではないということです。これが最終的に問題です。