conclusão do git com zsh: nomes de arquivos com espaços não estão sendo escapados corretamente

20

Conclusão do Git:

Estou tendo dificuldades com os preenchimentos automáticos de nome de arquivo do git no meu sistema. Estou usando zsh(5.0.5) com git(1.9.3) no OS X (10.9.3). Ambos zshe gitforam instalados via homebrew. (A versão completa está na parte inferior da postagem.)

gitA conclusão do nome do arquivo não está inserindo espaços como eu esperava. Quando digito o nome de um arquivo com um espaço no nome, o shell insere o nome do arquivo sem espaços vazios. zshA conclusão incorporada não faz isso, mas gitsim.

Aqui está um exemplo do que estou vendo.

Eu tenho um repositório com alguns arquivos com espaços em seus nomes.

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

A barra invertida do shell escapa os nomes dos arquivos conforme o esperado quando eu uso o preenchimento de tabulação para inserir o nome do arquivo.

% echo "testing" >> test<tab>

é completado automaticamente após pressionar a guia três vezes.

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

git status mostra esses nomes de arquivos entre aspas (ele entende totalmente o que está acontecendo):

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

mas quando tento git addcom o preenchimento automático da guia, ele fica para o lado.

% git add test<tab>

resulta nisso depois de clicar na guia três vezes:

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

Eu tentei regredindo isso um pouco: meus dotfiles estão em controle de versão, então eu tentei zsh 4.3.15, git 1.8.3e meus dotfiles de um ano atrás, quando estou quase certo isso funcionou. Estranhamente, essa configuração ainda estava quebrada.

Eu reduzi-lo ao _gitarquivo de conclusão que está sendo originada 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

Se eu alterar manualmente $FPATHantes das minhas .zshrcexecuções compinit(ou simplesmente remover o /usr/local/share/zsh/site-functions/_gitlink simbólico), as conclusões voltarão zshe funcionarão conforme o esperado.

A zshconclusão sem _git:

% git add test<tab>

pressionar a guia três vezes produz resultados corretos:

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

Nota lateral: tentei remover o git-completion.bashlink e ele quebra totalmente as coisas:

% git add test<tab>

produz este flagra-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                

Eu realmente quero que isso funcione corretamente: o restante das _gitconclusões foi ótimo porque elas são mais conscientes do que as zshnovas, mas eu preciso de nomes de arquivos com espaços ou outros caracteres especiais para que possam escapar adequadamente.


Versões de 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

Fiz upload dos arquivos _gite git-completion.bash: git-conclusão.bash e _git (renomeado para _git.shque o CloudApp o torne visível no navegador).

cbowns
fonte
2
Para os usuários não OSX presentes na platéia, você poderia criar um link para algum lugar onde possamos fazer o download das conclusões fornecidas com o seu pacote git?
Gilles 'SO- stop be evil'
2
Claro: _git (renomeado para _git.sh para CloudApp): cl.ly/code/423e0i1X1p29 e git-conclusão.bash: cl.ly/code/153v2t142i2G
cbowns
3
Eu dei uma olhada _git. As chamadas compadd -Qparecem estranhas: -Qsignifica "não citar caracteres especiais". Tente remover -Qdas compaddchamadas.
Gilles 'SO- stop be evil'
3
Tenho certeza de que o problema se deve ao zshcomportamento padrão de resultados de substituição de comando sem divisão de palavras. De fato - a \bsfuga não é necessária - ou é inútil, dependendo de como você a vê. Defina "SH_WORD_SPLIT" zsh.sourceforge.net/FAQ/zshfaq03.html
mikeserv
4
Como alternativa, edite as funções de conclusão do bash para exibir como ${=$(completion)}ou o que elas retornam.
mikeserv

Respostas:

5

Este bug é mencionado na lista de discussão .

A correção é editar o arquivo git-completion.zshe remover a -Qopção de compadd, em __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 ()

Este arquivo é instalado a partir do contrib/completiondiretório e seu caminho pode variar com o seu gerenciador de pacotes. Se você instalou o homebrew no macOS, ele está localizado em /usr/local/Cellar/git/2.10.2/share/zsh/site-functions.

toasted_flakes
fonte
O erro __git_aliased_commandé que o diretório de compartilhamento mudou o nome para git-core (pelo menos no FreeBSD), o que faz com que ele não seja encontrado git-completion.bash. Se você alterar o primeiro local na linha 33 para um código fixo, /usr/local/share/git-core/contrib/completion/git-completion.bashele funcionará novamente.
Melvyn
Há um echonesse arquivo logo acima estas definições de funções, ea falta de aparência dela no meu shell (e algum código adjacente ao testar) sugere que estas conclusões não são ainda utilizados:if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
cbowns
11
Isso funcionou para mim (git 2.18, zsh 5.4.2 osx) quando eu mudei compadd -Q-> compaddpara todas as instâncias na _gite git-completion.bashna pasta /usr/local/Cellar/git/2.18.0/share/zsh/site-functions/da minha instalação do brew git. Obrigado!!!
Merlin