自动完成目录中的文件名


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 "

Answers:


15

尝试:

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

complete -F _codeComplete hi

您需要在中指定-W选项,compgen并引用产生单词表的命令。

有关如何在此博客上编写完成功能的更多信息:编写自己的Bash完成功能


6
对于包含空格和其他特殊字符的文件名,此操作将失败。
吉尔(Gilles)'所以

2
complete如果您不知道该命令的名称并正在搜索autocomplete或找到它,那将很难找到它的名称tab-completion。这是我找到命令名称的第一个地方,也是我eject升级到Ubuntu时需要修复的名称14.04($ complete -p ls-> complete -F _longopt ls,所以解决方法是:complete -F _longopt eject)(希望此评论可以帮助其他人找到它!)
Izkata 2014年

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的答案,但是有antak在SO上提供的转义:https : //stackoverflow.com/a/11536437/1536933


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

complete -o nospace -F _hi hi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.