Zsh

使用裸 git repo 自動完成 Zsh 文件

  • June 17, 2021

我的 .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" "$@"

它適用於文件,但隨後子命令和參數中斷。

謝謝。

如果--git-dir出現在命令行上,完成程式碼會辨識它並在查找要完成的內容時將其考慮在內,前提是您的 zsh 足夠新(≥5.3)。它通過將參數--git-dir作為環境變數傳遞給它來做到這一點GIT_DIR。例如,要在 之後完成遠端名稱git fetch,zsh 執行git remote. 之後,git --git-dir=/some/wherezsh在環境中執行。所以這部分確實有效。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-diror--work-tree放在別名中,這是透明的:zsh 在完成之前擴展別名(假設你沒有關閉 option 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_DIRGIT_WORKTREE使用的值。該函式的名稱在$service.

引用自:https://unix.stackexchange.com/questions/550559