ディレクトリのファイル名の自動補完

ディレクトリのファイル名の自動補完

この質問は以下に関連しています。これしかし、解決策を理解できません。私も知っていますこのチュートリアルしかし、まだ私が何を間違っているのか理解できません。

次の場所にあるディレクトリのリストをオートコンプリートしようとしています/something/

$ ls /something/

One    Other    Three

どういうわけかこのようなことが起こります:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

最初の単語がhionly 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

関連情報