使用裸 git repo 自動完成 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" "$@"
它適用於文件,但隨後子命令和參數中斷。
謝謝。
如果
--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
or--work-tree
放在別名中,這是透明的:zsh 在完成之前擴展別名(假設你沒有關閉 optioncomplete_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
.