使用 zsh 完成 git:帶有空格的文件名沒有被正確轉義
Git完成:
我在系統上使用 git 的文件名自動完成時遇到了困難。我在 OS X (10.9.3) 上使用
zsh
(5.0.5) 和git
(1.9.3)。兩者zsh
都已git
通過自製軟體安裝。(完整版輸出在文章底部。)
git
的文件名完成沒有像我期望的那樣插入空格。當我鍵入名稱中帶有空格的文件名時,shell 會插入文件名而不轉義空格。zsh
的內置補全不會這樣做,但git
’s 會。這是我所看到的一個例子。
我有一個儲存庫,其中包含一些名稱中帶有空格的文件。
% ls -la test test four - latest.txt test three.txt test two
當我使用製表符完成插入文件名時,shell 反斜杠按預期轉義了文件名。
% echo "testing" >> test<tab>
點擊標籤三次後自動完成。
% echo "testing" >> test\ four\ -\ latest.txt ––– file test test\ four\ -\ latest.txt test\ three.txt test\ two
git status
在引號中顯示這些文件名(它完全理解發生了什麼):% git status --short M test M "test four - latest.txt" M "test three.txt" M "test two"
但是當我嘗試
git add
使用選項卡自動完成時,它會橫向移動。% git add test<tab>
三次點擊選項卡後導致此結果:
% git add test four - latest.txt test test four - latest.txt test three.txt test two
我已經嘗試對此進行一點回歸:我的點文件在版本控制中,所以我嘗試了
zsh 4.3.15
,git 1.8.3
和一年前的點文件,當時我幾乎可以肯定這有效。奇怪的是,這個設置仍然被打破。我已將其範圍縮小到
_git
來自以下位置的完成文件/usr/local/share/zsh/site-functions
:% echo $FPATH /usr/local/share/zsh/site-functions:/usr/local/Cellar/zsh/5.0.5/share/zsh/functions % ls -l /usr/local/share/zsh/site-functions _git@ -> ../../../Cellar/git/1.9.3/share/zsh/site-functions/_git _hg@ -> ../../../Cellar/mercurial/3.0/share/zsh/site-functions/_hg _j@ -> ../../../Cellar/autojump/21.7.1/share/zsh/site-functions/_j git-completion.bash@ -> ../../../Cellar/git/1.9.3/share/zsh/site-functions/git-completion.bash go@ -> ../../../Cellar/go/HEAD/share/zsh/site-functions/go
如果我在執行
$FPATH
之前手動更改(或只是刪除符號連結),那麼完成會回退並按預期工作。.zshrc``compinit``/usr/local/share/zsh/site-functions/_git``zsh
沒有
zsh
完成:_git
% git add test<tab>
三擊製表符會產生正確的結果:
% git add test\ four\ -\ latest.txt ––– modified file test test\ four\ -\ latest.txt test\ three.txt test\ two
旁注:我嘗試刪除
git-completion.bash
連結,但它完全破壞了一些東西:% git add test<tab>
產生這種破壞性:
% git add test__git_zsh_bash_func:9: command not found: __git_aliased_command git add test ––– file test test\ four\ -\ latest.txt test\ three.txt test\ two
我真的很想讓它正常工作:其餘的
_git
完成都很棒,因為它們比zsh
那些更能辨識回購,但我需要正確轉義帶有空格或其他特殊字元的文件名。軟體版本:
% zsh --version zsh 5.0.5 (x86_64-apple-darwin13.0.0) % git --version git version 1.9.3 % sw_vers ProductName: Mac OS X ProductVersion: 10.9.3 BuildVersion: 13D65
我已經上傳了
_git
和git-completion.bash
文件:git-completion.bash和_git(重命名為_git.sh
CloudApp 將使其在瀏覽器中可見。)
郵件列表中提到了這個錯誤。
修復方法是編輯文件並從, in in 中
git-completion.zsh
刪除-Q
選項。compadd``__gitcomp_file
--- i/contrib/completion/git-completion.zsh +++ w/contrib/completion/git-completion.zsh @@ -90,7 +90,7 @@ __gitcomp_file () local IFS=$'\n' compset -P '*[=:]' - compadd -Q -p "${2-}" -f -- ${=1} && _ret=0 + compadd -p "${2-}" -f -- ${=1} && _ret=0 } __git_zsh_bash_func ()
該文件是從
contrib/completion
目錄安裝的,其路徑可能因您的包管理器而異。如果您在 macOS 上安裝了 homebrew,它位於/usr/local/Cellar/git/2.10.2/share/zsh/site-functions
.