既存の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 () {
…
}