Configurando para detectar se um comando não existe, sugira instalação

22

O zshshell pode ser configurado para mostrar o que bashmostra quando um comando não existe, da mesma forma que isto:

kahless:~$ sysv-rc-conf  
The program 'sysv-rc-conf' is currently not installed.  You can install it by typing:  
sudo apt-get install sysv-rc-conf

em vez do prompt ZSH:

[kahless /home/teward]% sysv-rc-conf  
zsh: command not found: sysv-rc-conf

Nota: não quero alterar o prompt em si, mas quero alterar o resultado de zsh: command not foundpara uma saída do tipo bash The program 'progname' is currently not installed. You can install it by typing:ou similar.

Isso é possível com o ZSH?

Thomas Ward
fonte

Respostas:

22

Esse recurso é fornecido pelo pacote. O Ubuntu o instala por padrão e o ativa por padrão no bash, mas não no zsh. Basta adicionar esta linha ao seu :command-not-found Comando de instalação não encontrado~/.zshrc

. /etc/zsh_command_not_found
Gilles 'SO- parar de ser mau'
fonte
Esta solução funcionou. Existe uma maneira de se livrar de uma linha na saída, então? (observe que ele foi incluído na saída, como foi a The program 'progname' is currently not installed. You can install it by typing:parte) zsh: command not found: sysv-rc-conf
Thomas Ward
@EvilPhoenix: Qualquer lugar faria (exceto dentro de uma função ou algo obviamente). Não sei como remover a zsh: command not foundlinha.
Gilles 'SO- stop be evil'
Ok, provavelmente posso ignorar o "comando não encontrado parte". Porque a parte de instalação sugerida é boa e é bom saber que surgiu porque um comando não existia;)
Thomas Ward
para transformar a command not foundmensagem que você pode adicionar exitno final da função command_not_found_handlerem /etc/zsh_command_not_found.
jens_bo
4

Observe que você pode adicionar uma verificação se o arquivo existir, se você estiver compartilhando seu .zshrc em distribuições que não possuem um /etc/zsh_command_not_foundarquivo:

[[ -a "/etc/zsh_command_not_found" ]] && . /etc/zsh_command_not_found

Além disso, caso você esteja usando o oh-my-zsh , já existe um plugin command-not-found, que você pode adicionar à sua pluginsvariável que faz a mesma coisa.

zgerd
fonte
1

Se você estiver usando o oh-my-zsh , poderá procurar "plugins" dentro do seu .zshrc.

Adicione o command-not-foundplug - in à lista de plug-ins para carregar automaticamente (esse plug-in já está instalado por padrão).

Como isso:

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git command-not-found)
qaisjp
fonte
0

A maneira como funciona é através da função command_not_found_handle () no bash. O bash fornece um gancho que é basicamente uma função que é chamada quando um comando não é encontrado. A implementação do bash do Ubuntu intercepta e faz uma pesquisa de pacotes, enquanto o bash do Debian não (e o mesmo com zsh). Você pode verificar a página de manual do zsh para ver se isso tem uma função semelhante.

Aqui está como você pode começar, esperando que o zsh seja semelhante.

mpandit@mpandit-ubuntu:~$ command_not_found_handle() {echo 'Handler: Command not found!';}
mpandit@mpandit-ubuntu:~$ ddaadada
'Handler: Command not found!
mpandit@mpandit-ubuntu:~$
lobster1234
fonte
Isso não é uma diferença no Debian e no Ubuntu. A diferença é que o Ubuntu instala command-not-foundpor padrão e o Debian não. O recurso já existe para o zsh, mas não é ativado por padrão.
Gilles 'SO- stop be evil'
Isso pressupõe que command_not_found não está incluído no sistema. No entanto, não é o que estou procurando. Dito isto, a resposta do @Gilles é mais parecida com o que estou procurando, só estou tentando descobrir onde incluir a linha que ele especificou.
Thomas Ward
É chamado command_not_found_handlerem zsh. Consulte zsh.sourceforge.net/Doc/Release/Command-Execution.html .
Mikel
0

Além disso, se você não quiser que o zsh tenha esse comportamento 100% do tempo, é possível fazer manualmente algo como:

/usr/lib/command-not-found urxvt

ou adicione um comando não encontrado ao seu $ PATH

Jason Axelson
fonte
3
quando perguntei isso, eu queria que funcionasse o tempo todo: P
Thomas Ward