zshの強制ロード完了機能(Tabを押して強制する必要はありません)

zshの強制ロード完了機能(Tabを押して強制する必要はありません)

既存の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_normalfpath

強制ロードする方法はありますか_normal

_normalPS:以前にタブをクリックした後、シェルでこれを行うと、操作が上書きされるようです。

ベストアンサー1

zsh では、+Xフラグを渡してautoload関数を$fpath実行せずにロードできます。

配列を操作して関数を新しい名前にコピーすることもできますfunctions

autoload -Uz +X _normal
functions[_original_normal]=$functions[_normal]
_normal () {
}

おすすめ記事