Завершение 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