
既存のzsh補完関数を置き換え、元の関数への参照を維持したいと思います。(ここから)。たとえば、タブ補完が常にnice
コマンドラインの最初の単語として提案されるようにするには、次のようにします。
eval "$(declare -f _normal | sed '1s/.*/_original&/')"
_normal() {
if [[ $CURRENT == 1 ]] ; then
# suggest only "nice" as first word
_wanted commands expl "be nice" compadd nice
else
# do normal completion afterwards
_original_normal
fi
}
今私が理解したところによると、問題は新しいzsh_normal
がまだロードされていないことです。
PROMPT> functions _normal
_normal () {
# undefined
builtin autoload -XUz
}
ただし、初めて⇥をクリックするとロードされます。
PROMPT> functions _normal
_normal () {
local _comp_command1 _comp_command2 _comp_command skip
if [[ "$1" = -s ]]
then
skip=(-s)
else
skip=()
_compskip=''
<snap>
これは、そのビットだけが書き込まれてからロードできないため、上記のオーバーライドを_normal
私の.zshrcで実行できないことを意味します(.zshrcにファイルがありません)。builtin autoload
_original_normal
_original_normal
fpath
強制ロードする方法はありますか_normal
?
_normal
PS:以前にタブをクリックした後、シェルでこれを行うと、操作が上書きされるようです。
答え1
zsh では、+X
フラグを渡してautoload
関数を$fpath
実行せずにロードできます。
配列を操作して関数を新しい名前にコピーすることもできますfunctions
。
autoload -Uz +X _normal
functions[_original_normal]=$functions[_normal]
_normal () {
…
}
答え2
今私は走る
_normal &> /dev/null || true
_normal
他の完成と同様に、通常はシェルから直接呼び出すべきではなく(リダイレクトなしで)エラーメッセージが表示されます。
_default:compcall:12: コンプリート関数からのみ呼び出すことができます。
これらの呼び出しはエラーコードを返さないため、これは|| true
不要なようです。_normal