git的ZSH完成不會自動完成絕對路徑?
我有 git 儲存庫
/.git
,即我的文件系統的根目錄。當我在
/etc/foo/
do時git status
,git 告訴我文件../fstab
已更改。當我想
zsh
對命令使用完成時git
(仍在 /etc/foo/ 中),即:git diff ../fs<TAB>
這樣可行。但是當我使用絕對路徑時,即:
git diff /etc/fs<TAB>
然後
zsh
不完成絕對路徑。我怎樣才能告訴
zsh
完整的絕對路徑,以及相對路徑?我在 Debian Buster 上使用
zsh
版本。5.7.1-1
ZSH 完成:
Zsh 補全是使用通常位於
/usr/share/zsh/5.5/functions/Completion/Unix
(可能因發行版而異)的腳本完成的,每個命令補全的腳本都被命名_commandName
,Zsh 包含/處理那些具有$fpath
類似於變數的環境變數的腳本$PATH
,在這種情況下,使用的腳本是_git
,位置順序on$fpath
很重要,因為 Zsh 使用_git
它找到的第一個腳本並忽略其他腳本(如果存在)(也類似於$PATH
)。腳本:
就像在這個QA中解釋的那樣,作為一個例子,以下函式在
$PWD/
將其傳遞給之前添加到任何相對路徑_files
,這是文件的正常完成函式。_absolute_files () { local expansion=$PREFIX$SUFFIX; expansion=${(e)expansion} if [[ "${expansion%%/#}" != "${expansion:a}" ]]; then PREFIX="\$PWD/$PREFIX" fi _files "$@"; }
~/
這適用於許多常見情況,包括辨識以絕對…開頭的路徑解決方案:
預設補全
git
行為不包括相對路徑,我們可以編輯它的腳本並添加一個類似於上面解釋中的函式以添加對相對路徑的支持,或者我們可以簡單地用 ohmyzsh 的補全外掛替換預設補全git
,步驟如下:gitfast
將 ohmyzsh複製到某個位置(比如說
/location
):git clone https://github.com/ohmyzsh/ohmyzsh.git
編輯
~/.zshrc
並在配置文件底部添加以下內容以包括gitfast
:fpath=( /location/ohmyzsh/plugins/gitfast $fpath )
正如之前和這裡所解釋的,順序很重要。
~/.zcompdump*
通過刪除任何then run來更新完成記憶體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.