BashのProgrammable Completionのカスタム補完仕様を追加して、次のことを行います。入力されたコマンドが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
を1回呼び出すだけでこれを設定できることを望んでいましたが、マニュアルを読んだ後、これができるようには見えません。できますか?そして、そうでない場合、これを行うためにcompspecをどのように追加できますか?
次のようなカスタム補完機能を使用できます。
_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