completamento git con zsh: i nomi dei file con spazi non vengono salvati correttamente


20

Completamento Git:

Sto riscontrando difficoltà con il completamento automatico del nome file di git sul mio sistema. Sto usando zsh(5.0.5) con git(1.9.3) su OS X (10.9.3). Entrambi zshe gitsono stati installati tramite homebrew. (L'output della versione completa è in fondo al post.)

gitIl completamento del nome file non sta inserendo spazi come mi aspetto. Quando scrivo il nome di un file con uno spazio nel nome, la shell inserisce il nome del file senza spazi di escape. zshIl completamento incorporato non lo fa, ma lo gitfa.

Ecco un esempio di quello che sto vedendo.

Ho un repository con alcuni file con spazi nei loro nomi.

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

La barra rovesciata della shell sfugge ai nomi dei file come previsto quando uso il completamento della scheda per inserire il nome del file.

% echo "testing" >> test<tab>

si completa automaticamente dopo aver colpito la scheda tre volte.

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

git status mostra questi nomi di file tra virgolette (capisce perfettamente cosa succede):

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

ma quando provo a git addcompletare automaticamente la scheda, va di lato.

% git add test<tab>

risulta in questo dopo aver colpito la scheda tre volte:

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

Ho provato a regredire questo un po ': i miei dotfile sono in controllo di versione, così ho provato zsh 4.3.15, git 1.8.3e le mie dotfile da un anno fa, quando sono quasi certo questo ha funzionato. Stranamente, questa configurazione era ancora rotta.

Io ho ristretto la scelta per il _gitfile di completamento che si sta provenienti da /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

Se cambio manualmente $FPATHprima delle mie .zshrccorse compinit(o semplicemente rimuovo il /usr/local/share/zsh/site-functions/_gitlink simbolico), i completamenti tornano indietro zshe funzionano come previsto.

Il zshcompletamento senza _git:

% git add test<tab>

colpire la scheda tre volte produce risultati corretti:

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

Nota a margine: ho provato a rimuovere il git-completion.bashcollegamento e si rompe completamente le cose:

% git add test<tab>

produce questo fallimento:

% 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                

Voglio davvero farlo funzionare correttamente: il resto dei _gitcompletamenti sono stati fantastici perché sono più consapevoli dei repository rispetto a zshquelli, ma ho bisogno di nomi di file con spazi o altri caratteri speciali per essere correttamente salvati.


Versioni del software:

% 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

Ho caricato i file _gite git-completion.bash: git-completamento.bash e _git (rinominato in _git.shmodo che CloudApp lo renda visualizzabile nel browser.)


2
Per gli utenti non OSX tra il pubblico, potresti collegarti a un luogo in cui possiamo scaricare i completamenti forniti con il tuo pacchetto git?
Gilles 'SO- smetti di essere malvagio'

2
Sicuro: _git (rinominato in _git.sh per CloudApp): cl.ly/code/423e0i1X1p29 e git-completamento.bash: cl.ly/code/153v2t142i2G
cbowns

3
Ho dato un'occhiata _git. Le chiamate compadd -Qsembrano strane: -Qsignifica "non citare caratteri speciali". Prova a rimuovere -Qdalle compaddchiamate.
Gilles 'SO- smetti di essere malvagio'

3
Sono abbastanza sicuro che il problema sia dovuto al zshcomportamento predefinito di risultati di sostituzione dei comandi non frazionanti. In effetti - la \bsfuga non è necessaria - o è inutile, a seconda di come la vedi. Impostare "SH_WORD_SPLIT" zsh.sourceforge.net/FAQ/zshfaq03.html
mikeserv,

4
In alternativa, modifica le funzioni di completamento della bash in modo ${=$(completion)}tale che vengano restituite come o qualsiasi altra cosa.
Mikeserv,

Risposte:


5

Questo errore è menzionato nella mailing list .

La correzione consiste nel modificare il file git-completion.zshe rimuovere l' -Qopzione da compadd, in in __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 ()

Questo file viene installato dalla contrib/completiondirectory e il suo percorso può variare in base al gestore pacchetti. Se hai installato con homebrew su macOS, si trova in /usr/local/Cellar/git/2.10.2/share/zsh/site-functions.


L'errore __git_aliased_commandè dovuto al fatto che la directory di condivisione ha cambiato il nome in git-core (almeno su FreeBSD), il che non lo trova git-completion.bash. Se si modifica la prima posizione sulla linea 33 in un hardcoded /usr/local/share/git-core/contrib/completion/git-completion.bash, funziona di nuovo.
Melvyn,

C'è un echofile in quel file appena sopra queste definizioni di funzione, e la mancanza di apparenza nella mia shell (e qualche codice adiacente durante il test) suggerisce che questi completamenti non sono nemmeno usati:if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
cbowns

1
Questo ha funzionato per me (git 2.18, zsh 5.4.2 osx) quando ho cambiato compadd -Q-> compaddper tutte le istanze nella _gite git-completion.bashnella cartella /usr/local/Cellar/git/2.18.0/share/zsh/site-functions/della mia installazione di brew git. Grazie!!!
Merlin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.