Configuración para detectar si un comando no existe, sugerir instalación

22

¿Se zshpuede configurar el shell para mostrar lo que se bashmuestra cuando no existe un comando, de manera similar a esto:

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

en lugar del indicador ZSH:

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

Tenga en cuenta que no quiero cambiar el indicador en sí, pero quiero cambiar el resultado de zsh: command not founduna salida de bash The program 'progname' is currently not installed. You can install it by typing:o similar.

¿Es esto posible con ZSH?

Thomas Ward
fuente

Respuestas:

22

Esta característica es proporcionada por el paquete. Ubuntu lo instala de manera predeterminada y lo activa de manera predeterminada en bash pero no en zsh. Simplemente agregue esta línea a su :command-not-found Instalar comando no encontrado~/.zshrc

. /etc/zsh_command_not_found
Gilles 'SO- deja de ser malvado'
fuente
Esta solución funcionó. ¿Hay alguna manera de deshacerse de una línea en la salida, entonces? (tenga en cuenta que se incluyó en la salida, al igual que la The program 'progname' is currently not installed. You can install it by typing:parte) zsh: command not found: sysv-rc-conf
Thomas Ward
@EvilPhoenix: Cualquier lugar lo haría (excepto dentro de una función o algo obviamente). No sé sobre quitar la zsh: command not foundlínea.
Gilles 'SO- deja de ser malvado'
De acuerdo, probablemente pueda ignorar la "parte del comando no encontrado". Debido a que la parte de instalación sugerida es agradable, y es bueno saber que surgió porque no existía un comando;)
Thomas Ward
a su vez del command not foundmensaje se puede añadir exital final de la función command_not_found_handleren /etc/zsh_command_not_found.
jens_bo
4

Tenga en cuenta que es posible que desee agregar una marca si el archivo existe si está compartiendo su .zshrc en distribuciones que no tienen un /etc/zsh_command_not_foundarchivo:

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

Además, en caso de que esté usando oh-my-zsh , ya hay un complemento command-not-found, que puede agregar a su pluginsvariable que hace lo mismo.

zgerd
fuente
1

Si está utilizando oh-my-zsh , simplemente puede buscar "complementos" dentro de su .zshrc.

Agregue el command-not-foundcomplemento a la lista de complementos para cargar automáticamente (este complemento ya está instalado de forma predeterminada).

Me gusta esto:

# 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
fuente
0

La forma en que funciona es a través de la función command_not_found_handle () en bash. bash proporciona un enlace que es básicamente una función que se invoca cuando no se encuentra un comando. La implementación de bash de Ubuntu lo atrapa y realiza una búsqueda de paquetes, mientras que bash de Debian no (y lo mismo con zsh). Es posible que desee consultar la página de manual de zsh para ver si tiene una función similar.

Aquí es cómo puede comenzar, esperando que zsh sea similar.

mpandit@mpandit-ubuntu:~$ command_not_found_handle() {echo 'Handler: Command not found!';}
mpandit@mpandit-ubuntu:~$ ddaadada
'Handler: Command not found!
mpandit@mpandit-ubuntu:~$
langosta1234
fuente
Esto no es una diferencia en Debian y Ubuntu bash. La diferencia es que Ubuntu se instala command-not-foundpor defecto y Debian no. La función ya existe para zsh también, simplemente no está activada por defecto.
Gilles 'SO- deja de ser malvado'
Esto supone que command_not_found no está incluido en el sistema. Sin embargo, no es lo que estoy buscando. Dicho esto, la respuesta de @Gilles está más en la línea de lo que estoy buscando, solo estoy tratando de averiguar dónde incluir la línea que especificó.
Thomas Ward
Se llama command_not_found_handleren zsh. Consulte zsh.sourceforge.net/Doc/Release/Command-Execution.html .
Mikel
0

Además, si no desea que zsh tenga este comportamiento el 100% del tiempo, puede hacer algo como:

/usr/lib/command-not-found urxvt

o agregue command-not-found a su $ PATH

Jason Axelson
fuente
3
cuando pregunté esto, quería que funcionara todo el tiempo: P
Thomas Ward