Meu zshrc inclui a seguinte função para criar um diretório e depois inseri-lo:
function mcd () {
mkdir -p "$*" && cd "$*"
}
A função em si funciona bem, mas recebo um comportamento estranho com a conclusão. Se eu começar a digitar, por exemplo mcd ~/
, e depois pressionar Tab, a mensagem
_mtools_drives:3: command not found: mtoolstest
é inserido no ponto de inserção e nada é concluÃdo. O que eu quero é que o comando seja concluÃdo como mkdir
seria: zsh deve me oferecer os nomes dos diretórios existentes.
Como posso dizer ao zsh que, para fins de conclusão, ele deve tratar mcd
o mesmo que mkdir
?
O snippet a seguir faz
mcd
com que seja concluÃdo comomkdir
:A maneira como funciona é procurar a configuração de conclusão atual para arquivos
mkdir
. O código de conclusão de uma função (geralmente o nome de uma função de conclusão) é armazenado no array associativo_comps
. Assimcompdef $_comps[mkdir] mcd
declara quemcd
deve ser concluÃdo da mesma forma quemkdir
está concluÃdo agora.A função acima adiciona algumas sutilezas:
(($+_comps[$1]))
garante que, se$1
não houver um método de conclusão especificado, nenhum método de conclusão será definido para os outros argumentos.${@[2,-1]}
é a lista de argumentos para a função começando com o segundo, para que você possa especificar mais de um nome de comando para definir as conclusões. Na verdade, é${^@[a,-1]}
para que o texto ao redor da expansão da matriz seja replicado para cada elemento da matriz .=$1
define o nome do serviço a ser usado . Isso importa apenas para alguns comandos cuja função de conclusão lida com vários comandos intimamente relacionados. Por exemplo, a função de conclusão_gzip
manipula tantogzip
egunzip
quantopigz
eunpigz
;compdef _gzip foo
fazfoo
uso do comportamento padrão de_gzip
whilecompdef _gzip foo=pigz
fazfoo
uso do comportamento de_gzip
quando completa parapigz
.Voltando ao seu caso especÃfico, o preenchimento padrão para
mkdir
não apenas oferece diretórios, mas também opções, que sua função não suporta. Então, na verdade, seria melhor definirmcd
como apenas completar os diretórios existentes. Zsh vem com uma função auxiliar para isso (um wrapper não documentado em torno_files
de ).A razão pela qual você estava obtendo essas conclusões de aparência bizarra
mcd
é que é o nome de um comando de um conjunto de comandos que já foi moderadamente difundido mtools .compdef
usa o seguinte formulário:então uma ideia seria apontar o
name
ofmcd
para a_mkdir
função através do seguinte comando:no entanto, isso é um pouco incorreto, pois
mkdir
conclui vários sinalizadores que provavelmente também não devem ser fornecidos aocd
. Mais direto seria completar nos diretórios: