Shell 中特定于脚本的自动完成功能

Shell 中特定于脚本的自动完成功能

我创建了很多小脚本来帮助我日常生活。我想为它们提供自动完成功能,特别是我打算与人们分享它们。

现在,我知道我可以创建在登录时获取的自动完成功能,但为了优雅和可移植性,我寻求在脚本本身内部提供自动完成功能。

由于我在家里使用 zsh 而在我的 VPS 上使用 bash,所以我希望脚本是可移植的(或者根据 shell 切换行为),但对于任一环境,我已经对一个解决方案感到满意了。

答案1

[F]为了优雅和可移植性,我寻求在脚本本身内部提供自动完成功能。

您不能在 shell 脚本内部执行此操作。

传统上,脚本和二进制文件的 Bash 补全由指定目录中的条目处理(例如,/etc/bash_completion.d对于/usr/share/bash-completion/completionsBash)。

但是,这些所做的只是使用适当的参数调用内置命令complete。首次调用脚本时,您只需在其中一个目录中(需要 root 权限)或在 中进行输入即可~/.bashrc

基本语法如下:

# declare function to pass to `complete'
_myscript() 
{
    # declare variable `cur' (holds string to complete) as local
    local cur

    # initialize completion (abort on fail)
    _init_completion || return

    # if string to complete (`cur') begins with `-' (option)
    if [[ "$cur" == -* ]] ; then
        # complete to the following strings, if they start with `cur`
        COMPREPLY=( $( compgen -W '-a -b -c --foo --bar' -- "$cur" ) )
    else
        # otherwise, complete to elements in current directory that begin with `cur'
        _filedir -d
    fi

# if declaring the function was successful, use it when the command is `myscript'
} && complete -F _myscript myscript

例如,你可以将上述内容保存到~/.myscript_completion并附加

source ~/.myscript_completion

~/.bashrc

相关内容