web-dev-qa-db-ja.com

ディレクトリ内のファイル名のオートコンプリート

この質問は これ とよく似ていますが、解決策を理解できません。私も このチュートリアル を知っていますが、それでも私が間違っていることを理解できません。

/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 "
16
Donovan

試してください:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}

complete -F _codeComplete hi

compgen-Wオプションを指定し、ワードリストを生成するコマンドを引用する必要もあります。

このブログで補完関数を作成する方法の詳細: 独自のBash補完関数の記述

15
dogbane

受け入れられた答えを改善してみましょう。

元の答えは空白を含むファイル名で失敗します。調査の結果、入力セパレータを行末に変更できることがわかりました。

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 "

dogbaneEduardo Almeida dos Santos 'の回答に基づいて、しかし、SOでantakによって提供されるエスケープを使用: https://stackoverflow.com/a/11536437/15369

1
EM0
_hi() {
    COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}

complete -o nospace -F _hi hi
0
xdch47