文件路径的选择性Bash完成

时间:2019-01-17 23:59:18

标签: bash

是否有一种方法可以对文件路径进行bash补全(如ls程序),但仅适用于某个参数?我一直对文档感到困惑:https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html#Programmable-Completion-Builtins

我想使用-F选项设置我自己的功能,但是我只希望程序的一个子命令的文件路径完成。

请注意,使用compgen -f可以很容易地完成操作,但是这会返回完整路径的列表,例如:

# compgen -f /bin/
/bin/[
/bin/bash
/bin/cat
/bin/chmod
/bin/cp
/bin/csh
<snip>

但是ls这样完成:

# ls /bin/
[*         cat*       cp*        date*      df*        ed*
hostname*  ksh*       link*      ls*        mv*        ps*        
<snip>

我相信只有一个COMPREPLY列表是从完成例程发送回bash的,似乎没有办法区分完整的程序参数和bash显示的部分参数。除非有一些技巧,否则我可以使用。

不幸的是,完整路径字符串很快就会变得难以处理,特别是对于目录中包含大量文件的大型编程项目。

1 个答案:

答案 0 :(得分:1)

赞:

foo_completion.sh

_complete_foo_ () {
    # Current word
    local word=${COMP_WORDS[$COMP_CWORD]}
    # Previous word
    local pword=${COMP_WORDS[$((COMP_CWORD-1))]}

    if [ ${COMP_CWORD} -eq 1 ] ; then
        # The sub commands bar and baz are available
        COMPREPLY=( $(compgen -W "bar baz" -- "${word}" ))
    elif [ "${pword}" = "bar" ] ; then
        # (Only) For bar we do default filename completion (like ls)
        compopt -o default
    elif [ "${pword}" = "baz" ] ; then
        # For baz we do something else
        COMPREPLY=( $(compgen -W "something else" -- "${word}" ))
    fi

    return 0
}

complete -F _complete_foo_ foo

现在获取文件:

source foo_completion.sh

...并尝试完成

foo <tab><tab>      # bar baz
foo bar <tab><tab>  # file and dir name completion like ls
foo baz <tab><tab>  # something else
相关问题