Zsh завершение для всех исполняемых файлов в пути

1649
ebrious

Я написал скрипт, который сам принимает в качестве аргумента любой произвольный исполняемый файл в моем $ PATH. Есть ли способ создать функцию завершения zsh (или bash), которую я смог бы напечатать, myFunc to[Tab]и она будет выполнена, myFunc topнапример? Выбор только файлов, которые имеют права на выполнение, был бы предпочтительнее, но наличие любого и каждого файла в $ PATH было бы более чем полезно!

Я не могу представить, что система будет иметь значение, но она будет работать на Linux, BSD и Mac.

Спасибо!

0

1 ответ на вопрос

2
Adaephon

zsh has a completion function for commands in PATH named _path_commands. You can configure the completion to use it for myFunc by running:

compdef _path_commands myFunc 

Note: this requires that the zsh completion system to be initialized. Usually (as set up by compinstall) this happens in your ~/.zshrc with

# some zstyle configurations autoload -Uz compinit compinit 

Any calls to compdef need to be done after compinit. If you get "command not found" errors when running compdef, I suggest setting up the completion system with compinstall.

Note: for security, zsh will throw errors if any directories in your $fpath are world-writeable. If you receive the error:

zsh compinit: insecure directories, run compaudit for list. Ignore insecure directories and continue [y] or abort compinit [n]?

Do not simply hit y, but hit n and then try compaudit | xargs chmod g-w as suggested at https://stackoverflow.com/questions/13762280/zsh-compinit-insecure-directories

Большой! Спасибо! Это сработало отлично. Я также видел, что некоторые люди используют каталог «завершения» для хранения различной эвристики завершения. Это совместимо с этой парадигмой? Если были добавлены более сложные дополнения, они обычно не попадают в .zshrc? Еще раз спасибо! ebrious 9 лет назад 0
Я удалил принятый тег ответа, потому что в linux (но, как ни странно, не в Mac) попытка завершить любую функцию, отличную от myFunc, приводит к ошибке «_complete: 96: плохое математическое выражение: операнд, ожидаемый при« » ls [Tab] выдаст эту ошибку ebrious 9 лет назад 0
Я проверил это на Linux. * Ubuntu * 14.04 с * zsh * 5.0.5, * Arch Linux * с * zsh * 5.0.6 и теперь даже * TomatoUSB * с * zsh * 4.3.17 (альтернативная прошивка роутера с опцией ddwrt от nslu2). С моей собственной конфигурацией, а также без конфигурации (`zsh -f`). Это работало нормально в каждом случае, не нарушая другие дополнения. Могу ли я предположить, что что-то не так с * zsh * на вашем Linux-компьютере, в конфигурации или в установленном пакете. Все ли работает на вашем Linux, если вы просто пропустите `compdef _path_commands myFunc`? Adaephon 9 лет назад 0
Я снова приму ваш ответ, так как нашел необходимые изменения, чтобы он заработал. У моей конкретной установки zsh были некоторые каталоги в fpath, которые имели разрешение на запись, что привело к ошибке: «zsh compinit: небезопасные каталоги, запустите compaudit для списка. Игнорируйте небезопасные каталоги и продолжайте [y] или отменяйте compinit [n]?» Простое нажатие на 'y' приводит к проблеме с вашим ответом. Запуск «compaudit | xargs chmod gw» в соответствии с предложением https://stackoverflow.com/questions/13762280/ решил проблему. Могу ли я предложить изменить ваш ответ, чтобы включить эту возможность / решение? ebrious 9 лет назад 0