![使用 zsh 进行 git 补全:带空格的文件名未正确转义](https://linux22.com/image/37233/%E4%BD%BF%E7%94%A8%20zsh%20%E8%BF%9B%E8%A1%8C%20git%20%E8%A1%A5%E5%85%A8%EF%BC%9A%E5%B8%A6%E7%A9%BA%E6%A0%BC%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E6%9C%AA%E6%AD%A3%E7%A1%AE%E8%BD%AC%E4%B9%89.png)
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>
按 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>
按 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>
按三次 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 将使其在浏览器中可见。)
答案1
这个错误在邮件列表。
修复方法是编辑该文件git-completion.zsh
并删除, in in 中-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
.