这个问题与这个,但我无法理解解决方案。我也知道本教程,但我仍然无法理解我做错了什么。
我正在尝试自动完成放置在的目录列表/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