web-dev-qa-db-ja.com

zshによるgit補完:スペースを含むファイル名が適切にエスケープされない

Gitの完了:

私のシステムでは、gitのファイル名のオートコンプリートに問題があります。 OS X(10.9.3)でzsh(1.9.3)とともにgit(5.0.5)を使用しています。 zshgitの両方が、自作によってインストールされました。 (フルバージョンの出力は投稿の下部にあります。)

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

これが私が見ているものの例です。

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

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

タブ補完を使用してファイル名を挿入すると、シェルのバックスラッシュがファイル名をエスケープします。

% echo "testing" >> test<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>

タブを3回押した後の結果は次のとおりです。

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

私はこれを少し後退させてみました:私のドットファイルはバージョン管理されているので、zsh 4.3.15git 1.8.3と1年前の私のドットファイルを試してみましたが、これがうまくいくと確信しています。奇妙なことに、このセットアップはまだ壊れていました。

have_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

$FPATHcompinitを実行する前に.zshrcを手動で変更した場合(または単に/usr/local/share/zsh/site-functions/_gitシンボリックリンクを削除した場合)、完了はzshにフォールバックし、期待どおりに機能します。

_gitなしのzsh補完:

% git add test<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                

reallyはこれを適切に機能させたいと思っています。_gitの残りの補完は、zshよりもリポジトリに対応しているため、すばらしいものでした1つですが、適切にエスケープするには、スペースまたはその他の特殊文字を含むファイル名が必要です。


ソフトウェアのバージョン:

% 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はブラウザで表示できるようにします。)

21
cbowns

このバグは メーリングリスト で言及されています。

修正は、ファイルgit-completion.zshを編集し、-Qcompaddから__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にあります。

5
toasted_flakes