gitのZSH完成は自動的に絶対パスを完成しませんか?

gitのZSH完成は自動的に絶対パスを完成しませんか?

/.git私のファイルシステムのルートであるgitリポジトリがあります。

私が入って/etc/foo/実行すると、git statusgitはファイルが../fstab変更されたことを知らせます。

zshコマンド補完(まだ/etc/foo/にあります)を使用したい場合は、次のgitようになります。

git diff ../fs<TAB>

これはうまくいきます。しかし、絶対パスを使用すると、次のようになります。

git diff /etc/fs<TAB>

これによりzsh絶対パスが不完全になります。

zsh完全な絶対パスと相対パスをどのように知ることができますか?

私はDebian Busterのバージョンを使用していますzsh5.7.1-1

ベストアンサー1

ZSH完了:

Zshコンプリートは/usr/share/zsh/5.5/functions/Completion/Unix通常(デプロイメントによって異なる場合があります)にあるスクリプトを使用して実行されます。各コマンド補完のスクリプトには名前が付けられ、ZshにはVariablesに似た_commandName環境変数が含まれています。この場合、スクリプトはYes、Zshのため、場所の順序が重要です。見つかった最初のスクリプトを使用し、他のスクリプトがある場合は無視します(同様)。$fpath$PATH_git$fpath_git$PATH

スクリプト:

これで説明されているように品質保証そして例えば次の関数は、ファイルの一般的な完成関数$PWD/に渡す前に相対パスに追加します。_files

_absolute_files () {
  local expansion=$PREFIX$SUFFIX; expansion=${(e)expansion}
  if [[ "${expansion%%/#}" != "${expansion:a}" ]]; then
    PREFIX="\$PWD/$PREFIX"
  fi
  _files "$@";
}

~/これは、絶対などで始まるパス識別を含む多くの一般的なケースで機能します。

解決策:

デフォルトgitの完了アクションには相対パスは含まれません。スクリプトを編集し、上記と同様の機能を追加することで、相対パスのサポートを追加できます。またはgit基本的な完成を次の完成プラグインに簡単に変更できます。gitfastオメジッシュ次の手順を実行します。

クローンオメジッシュ特定の場所(例/location:)で:

git clone https://github.com/ohmyzsh/ohmyzsh.git

~/.zshrc設定ファイルの一番下に次を編集して追加しますgitfast

fpath=( /location/ohmyzsh/plugins/gitfast $fpath ) 

前に説明したように、順序が重要ですここ

~/.zcompdump*実行中のエントリを削除して完了キャッシュを更新しますcompinit

代替ソリューション:

関数に次のパッチを適用して/usr/share/zsh/5.5/functions/Completion/Unix/_git編集します。_git-diff

--- _git
+++ _git
@@ -766,6 +766,12 @@

   case $state in
     (from-to-file)
+  
+      if [[ $line[1] == *\/* ]]; then
+        _alternative 'files::_files' && ret=0
+        return ret
+      fi
+      
       # If "--" is part of $opt_args, this means it was specified before any
       # $words arguments. This means that no heads are specified in front, so
       # we need to complete *changed* files only.

おすすめ記事