带有zsh的git完成:带空格的文件名未正确转义


20

Git完成:

我无法在系统上使用git的文件名自动完成功能。我在OS X(10.9.3)上将zsh(5.0.5)与git(1.9.3 )一起使用。两者zshgit都已通过自制软件安装。(完整版本的输出在文章的底部。)

git的文件名完成不像我期望的那样插入空格。当我输入名称中带有空格的文件名时,shell将插入文件名而不会出现空格。zsh的内置补全功能不会执行此操作,而gits可以。

这是我所看到的示例。

我有一个存储库,其中包含一些名称中带有空格的文件。

% 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.15git 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将使其在浏览器中可见)。


2
对于听众中的非OSX用户,您可以链接到一些我们可以下载git软件包附带的完成内容的地方吗?
吉尔斯(Gilles)'所以

2
当然:_git(对于CloudApp,已重命名为_git.sh):cl.ly/code/423e0i1X1p29和git-completion.bash:cl.ly/code/153v2t142i2G
cbowns

3
我看了一眼_gitcompadd -Q看起来很怪异的电话:-Q意思是“不要引用特殊字符”。尝试-Qcompadd通话中删除。
吉尔斯(Gilles)'所以

3
我相当确定问题是由于zsh的默认行为而不是将单词拆分为命令替换结果。实际上- \bs逃避不是必需的-还是徒劳的,具体取决于您如何看待它。设置"SH_WORD_SPLIT" zsh.sourceforge.net/FAQ/zshfaq03.html
mikeserv

4
或者,编辑bash完成函数以输出like ${=$(completion)}或返回的结果。
mikeserv

Answers:


5

邮件列表中提到了此错误。

解决方法是编辑文件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上安装了自制软件,则它位于中/usr/local/Cellar/git/2.10.2/share/zsh/site-functions


关于错误__git_aliased_command的原因是因为共享目录将名称更改为git-core(至少在FreeBSD上),这导致它找不到git-completion.bash。如果将第33行的第一个位置更改为硬编码,/usr/local/share/git-core/contrib/completion/git-completion.bash它将再次起作用。
梅尔文

echo这些函数定义的上方有一个文件,并且在我的外壳中(以及测试时一些相邻的代码)都没有出现,这表明甚if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
补全

1
当我更改compadd -Q-> compadd对于brew git安装文件夹中_gitgit-completion.bash文件夹中/usr/local/Cellar/git/2.18.0/share/zsh/site-functions/的所有实例时,这对我有用(git 2.18,zsh 5.4.2 osx)。谢谢!!!
默林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.