Как определить завершение для имени функции "шаблон"?

У меня есть несколько функций, работающих только с каталогами, все имена функций следуют этому шаблону (оканчиваясь на _dir):

something_dir () { ... }
something_else_dir() { ... }
...

И для всех этих я определяю завершение:

complete -A directory something_dir something_else_dir ...

Можно ли определить завершение для всех функций автоматически, чтобы каждая новая функция, заканчивающаяся на _dir, выполняла только каталоги?

1 ответ

Решение

Использование compgen -A function перечислить все функции; затем grep -E '.*_dir$' отфильтровать функции, заканчивающиеся на _dir,

complete -A directory $(compgen -A function | grep -E '.*dir$')

Это предполагает, что все имена функций заканчиваются на _dir свободны от специальных символов, таких как * и пробелы. Согласно спецификации, это всегда должно быть так.

Эта команда настроит завершение только для уже существующих функций. Чтобы автоматически добавить завершение для функций, которые вы определите в интерактивном сеансе, добавьте команду в PROMPT_COMMAND так что он будет выполняться при каждом запросе.

PROMPT_COMMAND="complete -A directory \$(compgen -A function | grep -E '.*dir$')"
Другие вопросы по тегам