Завершение Bash для пользовательской команды для завершения статического дерева каталогов
Я хотел бы добавить пользовательскую спецификацию завершения для программируемого завершения bash, которая выполняет следующие действия: всякий раз, когда вводится команда fooЯ хотел бы сделать завершение имени файла / каталога для частичного токена после foo, но относительно фиксированного каталога (скажем, /a/b/c), а не текущий рабочий каталог.
Например, предположим, /a/b/c содержит файлы
hello goodbye cheers directory
а также /a/b/c/directory содержит файлы
adieu ciao
Затем набрав foo go<TAB> должен завершить go в goodbyeи набрав foo dir<TAB>ci<TAB> должен закончить аргумент сначала directory/ а затем directory/ciaoнезависимо от того, каков мой текущий рабочий каталог.
Я надеялся, что смогу это настроить всего одним звонком complete, но после прочтения руководства не похоже, что я могу это сделать. Это можно сделать? И, если нет, как я могу добавить compspec для этого?
1 ответ
Вы можете использовать пользовательскую функцию завершения, как показано ниже:
_foo () {
local cur
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
k=0
i="/a/b/c" # the directory from where to start
for j in $( compgen -f "$i/$cur" ); do # loop trough the possible completions
[ -d "$j" ] && j="${j}/" || j="${j} " # if its a dir add a shlash, else a space
COMPREPLY[k++]=${j#$i/} # remove the directory prefix from the array
done
return 0
}
А затем зарегистрируйте функцию, которая будет использоваться с вашей командой foo:
complete -o nospace -F _foo foo