この質問は これ とよく似ていますが、解決策を理解できません。私も このチュートリアル を知っていますが、それでも私が間違っていることを理解できません。
/something/
に配置されているディレクトリのリストをオートコンプリートしようとしています:
$ ls /something/
One Other Three
これが起こる方法で:
$ hi [TAB]
One Other Three
$ hi O[TAB]
One Other
最初の単語がhi
であり、/something/
内だけではない場合のみ。
これは私が.profile
でやっていることです:
_codeComplete()
{
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen `ls /something/` -- $cur) )
}
complete -F _codeComplete "hi "
試してください:
_codeComplete()
{
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}
complete -F _codeComplete hi
compgen
で-W
オプションを指定し、ワードリストを生成するコマンドを引用する必要もあります。
このブログで補完関数を作成する方法の詳細: 独自のBash補完関数の記述
受け入れられた答えを改善してみましょう。
元の答えは空白を含むファイル名で失敗します。調査の結果、入力セパレータを行末に変更できることがわかりました。
IFS=$'\n'
関数がスペースを正しく処理するようにします。
_codeComplete()
{
local cur=${COMP_WORDS[COMP_CWORD]}
IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -F _codeComplete hi
スペースを処理するだけでなく、エスケープするバージョンもここにあります:
_codeComplete()
{
local cur=${COMP_WORDS[COMP_CWORD]}
local AUTO_COMPLETE_DIRS=$(ls /something/)
IFS=$'\n' COMPREPLY1=( $(compgen -W "$AUTO_COMPLETE_DIRS" -- $cur))
COMPREPLY2=( "${COMPREPLY1[@]// /\ }" )
COMPREPLY=($(printf "%q\n" "${COMPREPLY2[@]}"))
}
complete -F _codeComplete "hi "
(dogbaneとEduardo Almeida dos Santos 'の回答に基づいて、しかし、SOでantakによって提供されるエスケープを使用: https://stackoverflow.com/a/11536437/15369 )
_hi() {
COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}
complete -o nospace -F _hi hi