zshを使用したgit補完:スペースを含むファイル名は適切にエスケープされません


20

Gitの完了:

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

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私はほぼ確信しているとき、および年前から私のドットファイルは、この働きました。奇妙なことに、このセットアップはまだ壊れていました。

それを_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>

タブを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をアップロードしました(CloudAppがブラウザーで表示できるように名前を変更しました)。git-completion.bash_git.sh


2
オーディエンスの非OSXユーザーの場合、gitパッケージに付属している完成版をダウンロードできる場所にリンクできますか?
ジル「SO-悪であるのをやめる」

2
確かに:_git(CloudAppの_git.shに名前変更):cl.ly/code/423e0i1X1p29およびgit-completion.bash:cl.ly/code/153v2t142i2G
cbowns

3
を一目見ました_gitcompadd -Q変に見える呼び出し:-Q「特殊文字を引用しない」ことを意味します。呼び出し-Qから削除してみてくださいcompadd
ジル 'SO-悪であるのをやめる'

3
問題の原因は、zsh単語を分割しないコマンド置換結果のデフォルトの動作にあると確信しています。実際には、\bsエスケープは必要ではありません-または、見方によっては無駄です。"SH_WORD_SPLIT" zsh.sourceforge.net/FAQ/zshfaq03.htmlを
mikeserv

4
または、bash補完関数を編集し${=$(completion)}て、返すような出力を作成します。
mikeserv

回答:


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にhomebrewをインストールした場合、それはにあり/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
cbownsは

1
これは、brew gitインストールのフォルダ内およびフォルダ内のすべてのインスタンスでcompadd -Q-> を変更したときに機能しました(git 2.18、zsh 5.4.2 osx)。ありがとうございました!!!compadd_gitgit-completion.bash/usr/local/Cellar/git/2.18.0/share/zsh/site-functions/
マーリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.