この質問は以下に関連しています。これしかし、解決策を理解できません。私も知っていますこのチュートリアルしかし、まだ私が何を間違っているのか理解できません。
次の場所にあるディレクトリのリストをオートコンプリートしようとしています/something/
。
$ ls /something/
One Other Three
どういうわけかこのようなことが起こります:
$ hi [TAB]
One Other Three
$ hi O[TAB]
One Other
最初の単語がhi
only insideの場合にのみ適用されます/something/
。
これが私がすることです.profile
:
_codeComplete()
{
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen `ls /something/` -- $cur) )
}
complete -F _codeComplete "hi "
答え1
努力する:
_codeComplete()
{
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}
complete -F _codeComplete hi
-W
オプションを指定compgen
し、単語リストを生成したコマンドを引用する必要があります。
完成関数の作成方法の詳細については、次のブログをご覧ください。独自のBash完成関数を書く
答え2
許可された回答を改善しようとします。
ファイル名にスペースが含まれているため、元の回答は失敗します。いくつかの調査の最後に、入力区切り文字を行末に変更できることに気づきました。
IFS=$'\n'
関数がスペースを正しく処理できるようにします。
_codeComplete()
{
local cur=${COMP_WORDS[COMP_CWORD]}
IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -F _codeComplete hi
答え3
以下はスペースを処理するだけでなく、エスケープするバージョンです。
_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 "
(目安として犬の納屋'砂エドゥアルド・アルメイダ・ドス・サントス'答えが提供されたエスケープに従ってアンタクそれだけです:https://stackoverflow.com/a/11536437/1536933)
答え4
_hi() {
COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}
complete -o nospace -F _hi hi