Zsh

使用 zsh 完成 git:帶有空格的文件名沒有被正確轉義

  • November 19, 2016

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

我已經上傳了_gitgit-completion.bash文件:git-completion.bash_git(重命名為_git.shCloudApp 將使其在瀏覽器中可見。)

郵件列表中提到了這個錯誤。

修復方法是編輯文件並從, 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.

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