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 zsh
et git
ont été installés via homebrew. (La sortie de la version complète se trouve au bas de l'article.)
git
L'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. zsh
L'achèvement intégré ne fait pas cela, mais c'est git
le 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 add
avec 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.3
et 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 _git
fichier 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 $FPATH
avant mes .zshrc
courses compinit
(ou que je supprime simplement le /usr/local/share/zsh/site-functions/_git
lien symbolique), les achèvements se replient zsh
et fonctionnent comme prévu.
L' zsh
achè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.bash
lien, 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 _git
finitions était génial car elles sont plus sensibles aux repo que zsh
celles, 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 _git
et git-completion.bash
: git-complétement.bash et _git (renommés pour _git.sh
que CloudApp le rende visible dans le navigateur.)
la source
_git
. L'appel àcompadd -Q
paraître bizarre:-Q
signifie «ne citez pas de caractères spéciaux». Essayez de supprimer-Q
descompadd
appels.zsh
comportement 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${=$(completion)}
ou quoi qu'elles reviennent.Réponses:
Ce bug est mentionné sur la liste de diffusion .
Le correctif consiste à modifier le fichier
git-completion.zsh
et à supprimer l'-Q
option decompadd
, dans dans__gitcomp_file
.Ce fichier est installé à partir du
contrib/completion
ré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
.la source
__git_aliased_command
est 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 trouvergit-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.bash
cela fonctionne à nouveau.echo
dans 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
compadd -Q
->compadd
pour toutes les instances dans_git
etgit-completion.bash
dans le dossier/usr/local/Cellar/git/2.18.0/share/zsh/site-functions/
de mon installation de brew git. Je vous remercie!!!