Conclusão do zsh: obtendo nomes de arquivos de um diretório específico

10

OK, um pouco de experiência: uso um Mac e faço o máximo possível na CLI.

Em particular, eu freqüentemente coloco um pendrive cpou mvum arquivo e, em seguida, desejo imediatamente ejetar (desmontar e desconectar). Isso geralmente pode ser realizado com algumas teclas, exceto para desmontá-lo, o que requer (na versão 10.7) ir para um espaço vazio na área de trabalho (geralmente a pelo menos dois espaços), selecionar o disco e pressionar "command-e". Francamente, esse procedimento de desmontagem é, por várias ordens de magnitude, a parte mais demorada e tediosa do processo.

Seria muito mais natural e eficiente simplesmente digitar, digamos:

ej<tab> J<tab>

Digamos que meu pendrive seja montado em / Volumes / Jefferson. O que eu esperaria obter das minhas 6 teclas é o seguinte:

eject /Volumes/Jefferson

Isso deve executar o comando:

diskutil unmount /Volumes/Jefferson

Então, eu escrevi uma pequena função agradável:

eject() {
    diskutil unmount /Volumes/$1
}

E uma função de conclusão para acompanhar:

compdef '_files -g "/Volumes/*"' eject  

Há um problema com isso, no entanto. A _filesfunção gera caminhos completos. Agora, eu poderia alterar a linha na minha função "ejetar" para diskutil unmount $1e as coisas funcionariam, mas não tenho a capacidade de digitar a primeira letra do nome do ponto de montagem, pois o caminho começa com / Volumes /. Por exemplo, se eu digitar J<tab, receberei o preenchimento automático dos arquivos no PWD. Eu teria que digitar /Volumes/J<tab>para obter a conclusão desejada.

Então, existe uma função de conclusão que captura nomes de arquivos de um local específico predefinido, em vez de gerar caminhos completos?

Eu realmente gostaria de reduzir isso para 6 teclas.

Marshall Eubanks
fonte

Respostas:

12
_files -W /Volumes

Veja a documentação de _path_files.

Gilles 'SO- parar de ser mau'
fonte
Perfeito! Eu sabia que isso tinha que ser construído. Muito obrigado!
Marshall Eubanks
Então, como faço para carregar automaticamente essa função de conclusão? Eu tentei colocar a compdeflinha no arquivo _ejectlocalizado no meu fpath. Eu tentei com e sem uma linha de carregamento automático. Eu olhei para vários guias sobre funções de conclusão e ninguém abordou como fazer um exemplo realmente simples como esse, e nada que eu tentei com base em nenhum dos exemplos funcionou.
Marshall Eubanks
@ marshaul Você precisa ter #compdef ejectcomo primeira linha do arquivo e depois o código real. Veja em arquivos carregados automaticamente no manual. Se você não adicionou a linha primeiro, pode ser necessário excluir o cache ~/.zcompdumpe reiniciar o zsh.
Gilles 'SO- stop be evil'
Ah! Excluir ~/.zcompdumpfez o truque. Obrigado novamente!
Marshall Eubanks