Configuration pour détecter si une commande n'existe pas, suggérer l'installation

22

Le zshshell peut-il être configuré pour afficher ce qui bashs'affiche lorsqu'une commande n'existe pas, de la même manière que ceci:

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

plutôt que l'invite ZSH:

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

Remarque Je ne souhaite pas modifier l'invite elle-même, mais je souhaite modifier le résultat de zsh: command not founden une sortie de type bash The program 'progname' is currently not installed. You can install it by typing:ou similaire.

Est-ce possible avec ZSH?

Thomas Ward
la source

Réponses:

22

Cette fonctionnalité est fournie par le package. Ubuntu l'installe par défaut et le rend actif par défaut dans bash mais pas dans zsh. Ajoutez simplement cette ligne à votre :command-not-found Installer la commande introuvable~/.zshrc

. /etc/zsh_command_not_found
Gilles 'SO- arrête d'être méchant'
la source
Cette solution a fonctionné. Y a-t-il un moyen de se débarrasser d'une ligne dans la sortie, alors? (notez qu'il a été inclus dans la sortie, tout comme la The program 'progname' is currently not installed. You can install it by typing:partie) zsh: command not found: sysv-rc-conf
Thomas Ward
@EvilPhoenix: n'importe où ferait l'affaire (sauf à l'intérieur d'une fonction ou quelque chose de toute évidence). Je ne sais pas supprimer la zsh: command not foundligne.
Gilles 'SO- arrête d'être méchant'
D'accord, je peux probablement ignorer la "partie commande non trouvée". Parce que la partie d'installation suggérée est sympa, et c'est agréable de savoir qu'elle est venue parce qu'une commande n'existait pas;)
Thomas Ward
pour désactiver le command not foundmessage, vous pouvez ajouter exità la fin de la fonction command_not_found_handlerdans /etc/zsh_command_not_found.
jens_bo
4

Notez que vous souhaiterez peut-être ajouter une vérification si le fichier existe si vous partagez votre .zshrc entre des distributions qui n'ont pas de /etc/zsh_command_not_foundfichier:

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

De plus, dans le cas où vous utilisez oh-my-zsh , il existe déjà un plugin command-not-found, que vous pouvez ajouter à votre pluginsvariable qui fait la même chose.

zgerd
la source
1

Si vous utilisez oh-my-zsh , vous pouvez simplement rechercher des "plugins" dans votre .zshrc.

Ajoutez le command-not-foundplugin à la liste des plugins à charger automatiquement (ce plugin est déjà installé par défaut).

Comme ça:

# 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
la source
0

La façon dont cela fonctionne est à travers la fonction command_not_found_handle () dans bash. bash fournit un hook qui est essentiellement une fonction qui est invoquée lorsqu'une commande n'est pas trouvée. L'implémentation bash d'Ubuntu la piège et effectue une recherche de paquets, tandis que bash de Debian ne le fait pas (et la même chose avec zsh). Vous voudrez peut-être consulter la page de manuel de zsh pour voir si cela a une fonction similaire.

Voici comment vous pouvez commencer, en espérant que zsh soit similaire.

mpandit@mpandit-ubuntu:~$ command_not_found_handle() {echo 'Handler: Command not found!';}
mpandit@mpandit-ubuntu:~$ ddaadada
'Handler: Command not found!
mpandit@mpandit-ubuntu:~$
homard1234
la source
Ce n'est pas une différence entre Debian et Ubuntu. La différence est qu'Ubuntu s'installe command-not-foundpar défaut et Debian non. La fonctionnalité existe déjà pour zsh également, elle n'est tout simplement pas activée par défaut.
Gilles 'SO- arrête d'être méchant'
Cela suppose que command_not_found n'est pas inclus dans le système. Mais ce n'est pas ce que je recherche. Cela dit, la réponse de @Gilles est plus dans le sens de ce que je recherche, j'essaie juste de savoir où inclure la ligne qu'il a spécifiée.
Thomas Ward
Cela s'appelle command_not_found_handleren zsh. Voir zsh.sourceforge.net/Doc/Release/Command-Execution.html .
Mikel
0

De plus, si vous ne voulez pas que zsh ait ce comportement 100% du temps, vous pouvez simplement faire manuellement quelque chose comme:

/usr/lib/command-not-found urxvt

ou ajoutez une commande introuvable à votre $ PATH

Jason Axelson
la source
3
quand je lui ai demandé, je voulais que ça marche tout le temps: P
Thomas Ward