上下文
我正在创建一个外壳程序,它是一个命令行工具.我想为此工具创建自己的自动完成功能.
我想做两种不同的事情(也许我应该发布两个问题):
>对于–install和-i选项,我想像ls命令一样自动完成文件路径.
>对于–unit-test和-t选项,我想在可以运行my_app –directory的特定目录中自动完成文件路径.
my_app_autocomplete文件
__my_app_autocomplete()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help -h --install -i --run -r --rebuild -rb --show-running-containers -ps --stop -s --remove -rm --logs -l --bash -b --sass -css --unit-tests -t"
containers="Nginx PHP MysqL mongo node"
sass="watch"
# By default, autocomplete with options
if [[ ${prev} == my_app ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
# By default, autocomplete with options
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
# For --install and -i options, autocomplete with folder
if [ ${prev} == --install ] || [ ${prev} == -i ] ; then
COMPREPLY=( $(compgen -d -- ${cur}) )
return 0
fi
# For --stop --remove --logs and --bash, autocomplete with containers
if [ ${prev} == --stop ] || [ ${prev} == -s ] || [ ${prev} == --remove ] || [ ${prev} == -rm ] || [ ${prev} == --logs ] || [ ${prev} == -l ] || [ ${prev} == --bash ] || [ ${prev} == -b ] ; then
COMPREPLY=( $(compgen -W "${containers}" -- ${cur}) )
return 0
fi
# For --sass and -css, complete with sass options
if [ ${prev} == --sass ] || [ ${prev} == -css ] ; then
COMPREPLY=( $(compgen -W "${sass}" -- ${cur}) )
return 0
fi
# For --unit-tests and -t, complete with relative to my_app folder paths
if [ ${prev} == --unit-tests ] || [ ${prev} == -t ] ; then
COMPREPLY=( $(compgen -d -- ${cur}) )
return 0
fi
}
complete -F __my_app_autocomplete my_app
问题
我不了解compgen选项以及如何使用它.也许我可以尝试运行一个子命令,但是我不知道语法,我找不到任何有用的信息,除了man of bash – Programmable completion builtins并没有提供关于compgen的太多信息.
在这种情况下,当我这样做时:
user@computer:~$my_app --install D[TAB][TAB]
我想要:
user@computer:~$my_app --install Documents/
我得到:
user@computer:~$myapp --install Documents
该行的末尾有一个空格,这是一个问题,因为我必须擦除它并添加一个/才能重做[TAB] [TAB]以自动完成子目录.
调查
-o空格
如果使用-o nospace选项,则完整地应用为:
complete -o nospace -F __my_app_autocomplete my_app
行为是:
user@computer:~$myapp --i[TAB][TAB]
user@computer:~$myapp --install
没有空间.
user@computer:~$myapp --install D[TAB][TAB]
user@computer:~$myapp --install Documents
没有空间.
问题:
>它将删除所有选项的空格,迫使我在不是文件路径的空格之后手动添加空格(例如–install)
>我必须添加/才能导航到子目录
-o文件名
使用-o选项时,文件名的完整应用方式为:
complete -o filenames -F __my_app_autocomplete my_app
行为是:
user@computer:~$myapp --i[TAB][TAB]
user@computer:~$myapp --install
与空间
user@computer:~$myapp --install D[TAB][TAB]
user@computer:~$myapp --install Documents/
有/且没有空格(如果它是目录)
user@computer:~$myapp --install f[TAB][TAB]
user@computer:~$myapp --install file
如果是文件则带有空格
似乎只为未在单词列表中定义的完成设置路径,因此它不会影响其他完成,我认为这是我需要的第一部分.
从特定目录
我将打开另一个问题以避免混淆:How to autocomplete a bash commandline with file paths from a specific directory without displaying this directory?
解决方法:
替代
complete -F __my_app_autocomplete my_app
同
complete -o filenames -F __my_app_autocomplete my_app
在这里您可以找到所有解释的compgen选项:
https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。