ベアGitリポジトリを使用したZshファイルの自動補完

ベアGitリポジトリを使用したZshファイルの自動補完

私の.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-dirzshが十分に新しい場合(≥5.3)、完了コードはそれを認識し、完了するタスクを見つけるときにそれを考慮します。引数を環境変数に渡して--git-dirこれを行いますGIT_DIR。たとえば、リモート名を完成させるには、git fetchzshを実行しますgit remote。その後、git --git-dir=/some/whereその環境でzshが実行されますgit remoteGIT_DIR=/some/whereだからこの部分はうまくいきます。

残念ながら、現在のzshバージョン(5.7.1+)では通過します。拡張されていない議論。したがって、そのように書くとgit --git-dir=~/repositories/foo.gitzshは通過します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を呼び出したという事実もわかりません。

このパッチが機能しない場合、または独自のバージョンを維持したくない場合は、_gitgitをラップするカスタム完了機能を使用してカスタムコマンドを定義することでこの問題を解決できます。

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

おすすめ記事