是否可以强制将 bash tab 完成建议列在单个列中?

是否可以强制将 bash tab 完成建议列在单个列中?

当我输入文件名并双击 Tab 时,会出现一个目录列表,建议所有 Tab 补全选项。默认情况下,它以与 相同的格式列出,但ls我希望它以更内联的方式列出选项ls -l。这可能吗?

我也有兴趣看看是否可以通过这种方式进行进一步的定制,尽管我不确定我想要什么,但一些想法的例子也很酷。

答案1

答案是,不是。

原因:

  1. “set” 或 “shopt” 中没有选项来指定 tab 补全建议的输出格式。唯一的例外是environ,但是,您不能将其更改为其他值。

  2. 对于自定义补全(如 --option 补全),您可以覆盖补全函数并将其输出到 stdout/stderr,以显示类似内容以及补全建议。但是,文件名补全是硬编码的,您无法通过内置函数ls -l覆盖它。complete

下面是一个简短的脏示例,用于显示详细信息以及制表符补全建议。假设您有一个程序foo,它接受四个选项barbarrbarrrcar,脏补全函数将是:

function _foo() {
    local cmds=(bar barr barrr car)
    local cur n s
    if [ $COMP_CWORD = 1 ]; then
        cur="${COMP_WORDS[1]}"
        n="${#cur}"

        # -- dirty hack begin --
        echo
        cat <<EOT | while read s; do [ "${s:0:n}" = "$cur" ] && echo "$s"; done
bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving
car:      choose this option if you want a car
EOT
        # ++ dirty hack end ++

        COMPREPLY=($(compgen -W "${cmds[*]}" "$cur"))
    fi
} && complete -F _foo foo

现在您可以在建议之前看到一个简短的帮助文档:

$ foo ba<tab>
bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving
r

(最后一行的单个字符‘r’是前缀的自动完成ba。)

并且,当前缀有歧义时,完成函数会被评估两次,建议列表出现在最后:

$ foo bar<tab><tab>
bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving

bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving

bar    barr   barrr

相关内容