Завершение 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
Другие вопросы по тегам