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 zsh
e git
foram instalados via homebrew. (A versão completa está na parte inferior da postagem.)
git
A 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. zsh
A conclusão incorporada não faz isso, mas git
sim.
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 add
com 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.3
e meus dotfiles de um ano atrás, quando estou quase certo isso funcionou. Estranhamente, essa configuração ainda estava quebrada.
Eu já reduzi-lo ao _git
arquivo 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 $FPATH
antes das minhas .zshrc
execuções compinit
(ou simplesmente remover o /usr/local/share/zsh/site-functions/_git
link simbólico), as conclusões voltarão zsh
e funcionarão conforme o esperado.
A zsh
conclusã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.bash
link 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 _git
conclusões foi ótimo porque elas são mais conscientes do que as zsh
novas, 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 _git
e git-completion.bash
: git-conclusão.bash e _git (renomeado para _git.sh
que o CloudApp o torne visível no navegador).
fonte
_git
. As chamadascompadd -Q
parecem estranhas:-Q
significa "não citar caracteres especiais". Tente remover-Q
dascompadd
chamadas.zsh
comportamento padrão de resultados de substituição de comando sem divisão de palavras. De fato - a\bs
fuga não é necessária - ou é inútil, dependendo de como você a vê. Defina"SH_WORD_SPLIT"
zsh.sourceforge.net/FAQ/zshfaq03.html${=$(completion)}
ou o que elas retornam.Respostas:
Este bug é mencionado na lista de discussão .
A correção é editar o arquivo
git-completion.zsh
e remover a-Q
opção decompadd
, em__gitcomp_file
.Este arquivo é instalado a partir do
contrib/completion
diretó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
.fonte
__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 encontradogit-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.bash
ele funcionará novamente.echo
nesse 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
compadd -Q
->compadd
para todas as instâncias na_git
egit-completion.bash
na pasta/usr/local/Cellar/git/2.18.0/share/zsh/site-functions/
da minha instalação do brew git. Obrigado!!!