私の.zshrcには次のものがあります。
# command completion
autoload -Uz compinit
compinit
通常、コマンド、パラメータ、ファイルを参照できます。
ただし、git --git-dir=<the path> --work-tree="$HOME"
(通常はエイリアス)場合は、ファイルではなくサブコマンド(追加やプッシュなど)とパラメータに対してのみ機能します。ファイルも処理できたらと思います。
私はそれを次のスクリプトに入れてみました。
#!/usr/bin/env sh
git --git-dir=<the path> --work-tree="$HOME" "$@"
ファイルでは機能しますが、サブコマンドと引数は中断されます。
ありがとうございます。
答え1
コマンドラインにある場合、--git-dir
zshが十分に新しい場合(≥5.3)、完了コードはそれを認識し、完了するタスクを見つけるときにそれを考慮します。引数を環境変数に渡して--git-dir
これを行いますGIT_DIR
。たとえば、リモート名を完成させるには、git fetch
zshを実行しますgit remote
。その後、git --git-dir=/some/where
その環境でzshが実行されますgit remote
。GIT_DIR=/some/where
だからこの部分はうまくいきます。
残念ながら、現在のzshバージョン(5.7.1+)では通過します。拡張されていない議論。したがって、そのように書くとgit --git-dir=~/repositories/foo.git
zshは通過しますGIT_DIR=~/repositories/foo.git
が、通過しませんGIT_DIR=/home/aaa/repositories/foo.git
。
zsh完了コードが正しくありません--work-tree
。
ファイルを編集して行を変更すると、拡張の問題を解決して--git-dir
サポートを追加できるようです。--git-worktree
_git
(( $+opt_args[--git-dir] )) && local -x GIT_DIR=$opt_args[--git-dir]
渡す
(( $+opt_args[--git-dir] )) && local -x GIT_DIR=${(e)~opt_args[--git-dir]}
(( $+opt_args[--work-tree] )) && local -x GIT_WORKTREE=${(e)~opt_args[--work-tree]}
私はこれをテストしていません。
私はzshメーリングリストに投稿するのにはやる気がありませんが、そうします。このパッチ(または機能しない場合は動作するバージョン)は便利なパッチになります。
--git-dir
または、エイリアスを入れると--work-tree
透明です。 zshは完了する前にエイリアスを拡張します(該当するオプションをオフにしないと仮定しますcomplete_aliases
)。これを関数やスクリプトの中に入れると不透明です。 zshはこれを見ることができず、ユーザーが指示しない限り、その関数やスクリプトがgitを呼び出したという事実もわかりません。
このパッチが機能しない場合、または独自のバージョンを維持したくない場合は、_git
gitをラップするカスタム完了機能を使用してカスタムコマンドを定義することでこの問題を解決できます。
gitx () {
git --git-dir=/some/where --work-tree=/else/where "$@"
}
_gitx () {
local -x GIT_DIR=/some/where GIT_WORKTREE=/else/where
_git "$@"
}
compdef _gitx gitx
複数のラッパーがある場合、各ラッパーには完成機能が必要です。あるいは、完了関数にいくつかのロジックを追加して、使用するGIT_DIR
合計値を決定することもできます。GIT_WORKTREE
関数名はにあります$service
。