23

zshには、次のgように動作するという関数があります。

  • 引数なしで、git status
  • 1つ以上の引数を使用して、指定されたすべての引数を使用してgitに委任します。git $@

gのタブ補完は、とまったく同じにしたいと思いますgit。これはで実現できますが、デフォルトでalias g=gitは呼び出すことができません(上記の最初のポイント)。status

の完了に委任するにはどうすればよいgitですか?

complete -F _git gbashでは、 gitの完了関数を再利用するだけです。zshを使用すると、gitの完了ははるかに複雑に見え、同様の解決策を見つけることができません。

zshには、「コマンド[x]を入力したふりをして、何を完了するか」という機能があると思います。それが何であるかを知っていれば、関数を使用してそれに委任するのに十分簡単なはずです。しかし、私はマニュアルにそのような機能を見つけませんでした。

4

2 に答える 2

23

のドキュメントにcompdefは次のように書かれています。

この関数compdefを使用して、既存の完了関数を新しいコマンドに関連付けることができます。例えば、

compdef _pids foo

しかし、それを適応させると(git_gitの通常の完了関数です)、(自動ロードされた後でも)動作する結果は得られませんでした:_git

compdef _git g

私はそれを介して動作させることができまし_dispatchた:

compdef '_dispatch git git' g
于 2010-11-19T02:35:43.897 に答える
0

設定を変更した後、この同じ関数が機能しなくなりました。

# in ~/.zsh/functions/g.zsh

# # No arguments: `git status`
# # With arguments: acts like `git`
g() {
  if [[ $# > 0 ]]; then
    git "$@"
  else
    git status
  fi
}

実際には、関数だけを配置し~/.zsh/functions/g.zsh、compdefを作成することが重要~/.zsh/completions/_gです。

#compdef g
compdef g=git

次に、で.zshrc

fpath=($HOME/.zsh/completions $fpath)

# load custom executable functions
for function in ~/.zsh/functions/*.zsh; do
  source $function
done

# completion
autoload -U compinit
compinit

順序が重要かどうかわからない。compdefが別のフォルダーにある場合、任意の順序で機能すると思います。

ここから関数を取得gしました:

https://github.com/thoughtbot/dotfiles/blob/master/zsh/functions/g

https://github.com/thoughtbot/dotfiles/blob/master/zsh/completion/_g

Thoughtbotに感謝します!

于 2021-08-20T22:29:02.520 に答える