zshを使用したGitの完了:スペースを含むファイル名が正しくエスケープされません。

zshを使用したGitの完了:スペースを含むファイル名が正しくエスケープされません。

子完成:

私のシステムでは、gitファイル名のオートコンプリートに問題があります。私はOS X(10.9.3)でzsh(5.0.5)と(1.9.3)を使用していますgit。どちらもhomebrewを介してインストールされzshましたgit。 (フルバージョンの出力は投稿の一番下にあります。)

gitファイル名の完成時に期待どおりにスペースが挿入されませんでした。名前にスペースを含むファイル名を入力すると、シェルはスペースをエスケープせずにファイル名を挿入します。zshの組み込み完成機能はこれを実行しませんが、gitsは実行します。

以下は私が見たものの例です。

名前にスペースを含むファイルを含むリポジトリがあります。

% ls -la
test
test four - latest.txt
test three.txt
test two

タブ補完を使用してファイル名を挿入すると、シェルバックスラッシュは期待どおりにファイル名をエスケープします。

% echo "testing" >> test<tab>

Tabキーを3回押すと自動的に実行されます。

% 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キーを3回押すと、次の結果が表示されます。

% git add test four - latest.txt
test                    test four - latest.txt  test three.txt          test two

私はこれを回帰しようとしました。私のドットファイルはバージョン管理にあるので、それを試してみましたが、これがうまくいくと確信していた1年前のドットファイルも試しました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実行する前に手動で変更するか、シンボリックリンクのみを削除すると、完了が再開され、期待どおりに機能します。.zshrccompinit/usr/local/share/zsh/site-functions/_gitzsh

zsh以下なしで完了_git

% git add test<tab>

正しい結果を得るには、Tabキーを3回押します。

% 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(CloudAppに名前を変更すると_git.shブラウザに表示されます。)

答え1

このエラーはメーリングリスト

回避策は、ファイルを編集してgit-completion.zshin-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

関連情報