web-dev-qa-db-ja.com

静的ディレクトリツリーを完成させるカスタムコマンドのbash補完

BashのProgrammable Completionのカスタム補完仕様を追加して、次のことを行います。入力されたコマンドがfooの場合は、fooの後の部分トークンのファイル名/ディレクトリ補完を行いたい、ただし現在の作業ディレクトリではなく、固定ディレクトリ(たとえば/a/b/c)に関連しています。

たとえば、/a/b/cにファイルが含まれているとします

hello goodbye cheers directory

/a/b/c/directoryにはファイルが含まれます

adieu ciao

次に、foo go<TAB>と入力してgogoodbyeに入力し、foo dir<TAB>ci<TAB>と入力して最初にdirectory/に、次にdirectory/ciaoに入力します、現在の作業ディレクトリが何であるかに関係なく。

私はcompleteを1回呼び出すだけでこれを設定できることを望んでいましたが、マニュアルを読んだ後、これができるようには見えません。できますか?そして、そうでない場合、これを行うためにcompspecをどのように追加できますか?

2

次のようなカスタム補完機能を使用できます。

_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
5
chaos