Настройка для обнаружения, если команда не существует, предложить установку

22

Можно zshли настроить оболочку, чтобы показать, что bashпоказывает, когда команда не существует, аналогично этому:

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

а не приглашение ZSH:

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

Примечание. Я не хочу изменять само приглашение, но я хочу изменить результат с zsh: command not foundbash-like вывода The program 'progname' is currently not installed. You can install it by typing:или аналогичного.

Это возможно с ZSH?

Томас Уорд
источник

Ответы:

22

Эта функция предоставляется пакетом. Ubuntu устанавливает его по умолчанию и делает его активным по умолчанию в bash, но не в zsh. Просто добавьте эту строку в ваш :command-not-found Установить команду не найден~/.zshrc

. /etc/zsh_command_not_found
Жиль "ТАК - перестань быть злым"
источник
Это решение сработало. Есть ли способ избавиться от строки в выводе, тогда? (обратите внимание, что это было включено в вывод, как и The program 'progname' is currently not installed. You can install it by typing:часть) zsh: command not found: sysv-rc-conf
Томас Уорд
@EvilPhoenix: в любом месте будет делать (кроме как внутри функции или что-то очевидно). Я не знаю об удалении zsh: command not foundлинии.
Жиль "ТАК - перестань быть злым"
Хорошо, я, вероятно, могу игнорировать "часть команды не найдена". Потому что рекомендуемая часть установки хороша, и приятно знать, что она появилась, потому что команда не существует;)
Томас Уорд
чтобы включить command not foundсообщение, которое вы можете добавить exitв конце функции command_not_found_handlerв /etc/zsh_command_not_found.
jens_bo
4

Обратите внимание, что вы можете добавить проверку, если файл существует, если вы делитесь своим .zshrc между дистрибутивами, у которых нет /etc/zsh_command_not_foundфайла:

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

Кроме того, если вы используете oh-my-zsh , уже есть плагин command-not-found, который вы можете добавить в свою pluginsпеременную, которая делает то же самое.

zgerd
источник
1

Если вы используете oh-my-zsh , вы можете просто искать «плагины» внутри вашего .zshrc.

Добавьте command-not-foundплагин в список плагинов для автозагрузки (этот плагин уже установлен по умолчанию).

Так:

# 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
источник
0

Это работает через функцию command_not_found_handle () в bash. bash предоставляет хук, который в основном является функцией, которая вызывается, когда команда не найдена. Реализация bash в Ubuntu перехватывает его и выполняет поиск пакетов, а bash в Debian - нет (и то же самое с zsh). Вы можете проверить man-страницу zsh, чтобы увидеть, имеет ли она подобную функцию.

Вот как вы можете начать, надеясь, что Zsh похож.

mpandit@mpandit-ubuntu:~$ command_not_found_handle() {echo 'Handler: Command not found!';}
mpandit@mpandit-ubuntu:~$ ddaadada
'Handler: Command not found!
mpandit@mpandit-ubuntu:~$
lobster1234
источник
В этом нет разницы в Debian и Ubuntu. Разница в том, что Ubuntu устанавливается command-not-foundпо умолчанию, а Debian - нет. Эта функция уже существует для zsh, но по умолчанию она не активирована.
Жиль "ТАК - перестать быть злым"
Это предполагает, что command_not_found не включен в систему. Однако это не то, что я ищу. Сказав это, ответ @Gilles больше похож на то, что я ищу, я просто пытаюсь выяснить, куда включить указанную им строку.
Томас Уорд
Это называется command_not_found_handlerна зш. См. Zsh.sourceforge.net/Doc/Release/Command-Execution.html .
Микель
0

Также, если вы не хотите, чтобы zsh имел такое поведение в 100% случаев, вы можете просто сделать что-то вручную:

/usr/lib/command-not-found urxvt

или добавьте команду not-found к вашей переменной $ PATH

Джейсон Аксельсон
источник
3
когда я спросил это, я хотел, чтобы это работало все время: P
Томас Уорд