自动完成目录中的文件名

自动完成目录中的文件名

这个问题与这个,但我无法理解解决方案。我也知道本教程,但我仍然无法理解我做错了什么。

我正在尝试自动完成放置在的目录列表/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 "

答案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

相关内容