git complétement avec zsh: les noms de fichiers avec des espaces ne sont pas correctement échappés


20

Achèvement de Git:

Je rencontre des difficultés avec la saisie semi-automatique de git sur mon système. J'utilise zsh(5.0.5) avec git(1.9.3) sur OS X (10.9.3). Les deux zshet gitont été installés via homebrew. (La sortie de la version complète se trouve au bas de l'article.)

gitL'achèvement du nom de fichier n'insère pas d'espaces comme je m'y attendais. Lorsque je tape le nom d'un fichier avec un espace dans le nom, le shell insère le nom de fichier sans espaces échappés. zshL'achèvement intégré ne fait pas cela, mais c'est gitle cas.

Voici un exemple de ce que je vois.

J'ai un référentiel avec quelques fichiers avec des espaces dans leurs noms.

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

La barre oblique inverse du shell échappe aux noms de fichiers comme prévu lorsque j'utilise la complétion de tabulation pour insérer le nom de fichier.

% echo "testing" >> test<tab>

se termine automatiquement après avoir appuyé trois fois sur l'onglet.

% echo "testing" >> test\ four\ -\ latest.txt
––– file
test                       test\ four\ -\ latest.txt  test\ three.txt            test\ two                

git status affiche ces noms de fichiers entre guillemets (il comprend parfaitement ce qui se passe):

% git status --short
 M test
 M "test four - latest.txt"
 M "test three.txt"
 M "test two"

mais quand j'essaye git addavec la saisie semi-automatique de tabulation, elle va latéralement.

% git add test<tab>

entraîne ceci après avoir appuyé trois fois sur l'onglet:

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

J'ai essayé un peu ce régresser: mes dotfiles sont dans le contrôle de version, donc je l' ai essayé zsh 4.3.15, git 1.8.3et mes dotfiles d'il y a un an, quand je suis presque certain cela a fonctionné. Bizarrement, cette configuration était encore cassée.

Je l' ai réduit au _gitfichier d'achèvement provenant de /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

Si je change manuellement $FPATHavant mes .zshrccourses compinit(ou que je supprime simplement le /usr/local/share/zsh/site-functions/_gitlien symbolique), les achèvements se replient zshet fonctionnent comme prévu.

L' zshachèvement sans _git:

% git add test<tab>

appuyer trois fois sur l'onglet produit des résultats corrects:

% git add test\ four\ -\ latest.txt
––– modified file
test                       test\ four\ -\ latest.txt  test\ three.txt            test\ two                

Note latérale: J'ai essayé de supprimer le git-completion.bashlien, et cela casse totalement les choses:

% git add test<tab>

produit cette busted-ness:

% 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                

Je veux vraiment que cela fonctionne correctement: le reste des _gitfinitions était génial car elles sont plus sensibles aux repo que zshcelles, mais j'ai besoin de noms de fichiers avec des espaces ou d'autres caractères spéciaux pour être correctement échappés.


Versions du logiciel:

% 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

J'ai téléchargé les fichiers _gitet git-completion.bash: git-complétement.bash et _git (renommés pour _git.shque CloudApp le rende visible dans le navigateur.)


2
Pour les utilisateurs non OSX dans l'audience, pourriez-vous créer un lien vers un endroit où nous pouvons télécharger les compléments livrés avec votre package git?
Gilles 'SO- arrête d'être méchant'

2
Bien sûr: _git (renommé _git.sh pour CloudApp): cl.ly/code/423e0i1X1p29 et git-complétement.bash: cl.ly/code/153v2t142i2G
cbowns

3
J'ai jeté un coup d'œil _git. L'appel à compadd -Qparaître bizarre: -Qsignifie «ne citez pas de caractères spéciaux». Essayez de supprimer -Qdes compaddappels.
Gilles 'SO- arrête d'être méchant'

3
Je suis à peu près sûr que le problème est dû au zshcomportement par défaut de ne pas séparer les résultats de substitution de commandes. En fait - l' \bsévasion n'est pas nécessaire - ou est futile, selon la façon dont vous la regardez. Définissez "SH_WORD_SPLIT" zsh.sourceforge.net/FAQ/zshfaq03.html
mikeserv

4
Vous pouvez également éditer les fonctions de complétion bash pour les afficher comme ${=$(completion)}ou quoi qu'elles reviennent.
mikeserv

Réponses:


5

Ce bug est mentionné sur la liste de diffusion .

Le correctif consiste à modifier le fichier git-completion.zshet à supprimer l' -Qoption de compadd, dans dans __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 ()

Ce fichier est installé à partir du contrib/completionrépertoire et son chemin peut varier en fonction de votre gestionnaire de packages. Si vous avez installé avec homebrew sur macOS, il se trouve dans /usr/local/Cellar/git/2.10.2/share/zsh/site-functions.


L'erreur __git_aliased_commandest due au fait que le répertoire de partage a changé de nom en git-core (au moins sur FreeBSD), ce qui le fait ne pas trouver git-completion.bash. Si vous changez le premier emplacement de la ligne 33 en un code dur, /usr/local/share/git-core/contrib/completion/git-completion.bashcela fonctionne à nouveau.
Melvyn

Il y a un echodans ce fichier juste au-dessus de ces définitions de fonctions, et son absence dans mon shell (et du code adjacent lors des tests) suggère que ces compléments ne sont même pas utilisés:if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
cbowns

1
Cela a fonctionné pour moi (git 2.18, zsh 5.4.2 osx) lorsque j'ai changé compadd -Q-> compaddpour toutes les instances dans _gitet git-completion.bashdans le dossier /usr/local/Cellar/git/2.18.0/share/zsh/site-functions/de mon installation de brew git. Je vous remercie!!!
Merlin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.