Como posso ajustar o sistema de conclusão do zsh para concluir arquivos "falsos" em algumas circunstâncias?
Mais precisamente, o sistema de arquivos AVFS expõe arquivos como diretórios, criando um "diretório falso" ao lado de cada arquivo. Por padrão, ele replica toda a hierarquia de diretórios sob seu ponto de montagem ~/.avfs
. Além disso, em ~/.avfs
todo arquivo morto, como /tmp/foo.zip
, além do próprio arquivo morto ~/.avfs/tmp/foo.zip
, existe um diretório chamado ~/.avfs/tmp/foo.zip#
que expõe o conteúdo do arquivo morto. No entanto, esse diretório extra não aparece na lista de ~/.avfs/tmp
: ele existe apenas quando solicitado explicitamente. (É semelhante à maneira como alguns montadores automáticos operam.)
mountavfs
cd ~/.avfs/tmp/foo.zip\#
Quando digito um comando como o descrito acima, foo.zip#
não aparece como conclusão abaixo ~/.avfs/tmp/
, pois não existe esse diretório. Como posso dizer ao zsh que sempre que houver um arquivo cujo caminho completo $arc
corresponda a ~/.avfs/**/*.(tgz|zip)
¹, ele deve fingir que existe um diretório chamado ${arc}#
?
(Observe que desejo que a conclusão funcione com todas as chamadas _files
ou _dirs
não, apenas no cd
comando. Prefiro não ter que duplicar o código da _files
função, se possível.)
¹ e todo o restante das extensões
fonte
/path/to/foo
é visível como~/.avfs/path/to/foo
.avfs
. Se ele apresentasse a#
entrada de diretório padrão para qualquer arquivo que correspondesse às seqüências de caracteres suportadas, ou mesmo a mágica testasse os arquivos em um diretório quanto ao necessário para ter uma#
entrada, a conclusão funcionaria. Eu acho que haveria um impacto no desempenho para algo comofind
agora arrastaria arquivos compactados.Respostas:
Uma resposta falsa parece insuficiente para esta pergunta falsa; o suporte embutido do zsh para diretórios automount opera nos diretórios (
fake-files dir:names
) e não nos padrões de arquivos nele. Isso é útil para adicionar arquivos chamados específicos para um diretório, que pode atenderautomount
ousshfs
ou NetApp.snapshot
tipo configurações onde o diretório-a-ser-montado é um nome estático conhecido,ALAS
.zshall(1)
diz que os "nomes" são cadeias de caracteres, e as experiências indicam que os metacaracteres (por exemplo,#
ou\#
ou'*(e:"echo hi":)'
) "não funcionam" de várias maneiras; portanto, não sei como colocar uma bola na parte de nomes dafake-files
declaração. (ExplorarSrc/Zle/computil.c
pode revelar exatamente quais são os nomes, mas isso seria mais trabalhoso.) (Além disso, o uso de globs recursivos na posição de diretório para nomear os arquivos não voou, mas novamente será necessário C C para ver quantofake-files
permite você se safa.)Com
compdef
, pode-se listar as.avfs
conclusões do diretório:Exceto se isso falhar, pois apenas mostrará os
#
arquivos quando isso não for importante e, portanto, não poderá ser concluído neles. (Existem usos produtivos para este formulário, embora não para este caso.)Usar
zstyle
o aproxima mais, com o seguinte.zshrc
:No entanto, ele pode apenas completar o
\#/
bit (em um debian squeeze virt com uma configuração padrão do avfs), mas não no sistema de arquivos virtual de um arquivo, portanto, será necessário um trabalho adicional para tabular os arquivos. Eu estou supondo que via_call_program ... ls
ou algo parecido com essas conclusões\#
esteja completo , a menos que haja uma maneira mais elegante de convencer-zsh
nos de que os diretórios que não existem existem.Más notícias! A conclusão não passa pelos
_path_files
diretórios falsos; Eu suspeito que isso esteja relacionado ao zsh globbing. O zsh 4.something on e o zsh 5.0.8 exibem o problema. Portanto, suspeito que uma correção completa exigiria correções_path_files
ou que escrevesse algo diferente que, caso contrário, seja concluído nesses diretórios falsos. Um rastreamento de depuração de conclusão pode ser gerado digitando-sels /root/.avfs/root/sometar.gz\#/
e depois no final dessa digitaçãocontrol-x
e?
, assumindobindkey -e
e_complete_debug
vinculado ao referido keycombo, se alguém quiser investigar por que isso está falhando.fonte
No zsh, você pode usar
compctl -K
para registrar sua própria função nas opções de conclusão da geração. Por exemplo:Então você precisa definir sua própria função:
Obviamente, o que precede precisa de mais trabalho, mas é algo para começar.
Uma função de conclusão personalizada semelhante (mas diferente) pode ser registrada para o bash.
Aqui está um exemplo com implementações para bash e zsh . (Ele oferece a conclusão de opções de linha de comando, pegando as opções na página de manual do comando.)
E aqui estão algumas dicas rápidas sobre coisas que podem funcionar na sua função de conclusão:
Ou talvez isso:
Boa sorte!
fonte
compctl
, ou seja, quero alterar o que_files
faz. Sua resposta não é de todo útil.