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


16

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

私はに配置されているディレクトリのリストを自動補完しようとしています/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 "

回答:


14

試してください:

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

complete -F _codeComplete hi

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

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


6
これは、空白やその他の特殊文字を含むファイル名では失敗します。
ジル 'SO-悪である停止

2
の名前を見つけるために変なふうに困難であるcompleteあなたはすでにそれを知っていないと探している場合は、コマンドをautocompletetab-completion...これは私がコマンド名を最初に見つかった場所だった、と私はそれを修正するために必要なものejectのUbuntuのアップグレードに14.04($ complete -p ls-> complete -F _longopt ls、したがって修正は:complete -F _longopt eject)(このコメントが他の人が見つけられることを願っています!)
Izkata 14

1

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

元の答えは、空白を含むファイル名では失敗します。いくつかの調査の後、入力セパレーターを行末に変更できることに気付きました:

IFS=$'\n'

関数がスペースを正しく処理するようにします。

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
    COMPREPLY=( "${tmp[@]// /\ }" )
}

complete -F _codeComplete hi

1

これは、スペースを処理するだけでなく、スペースもエスケープするバージョンです。

_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/1536933


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

complete -o nospace -F _hi hi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.