当我输入文件名并双击 Tab 时,会出现一个目录列表,建议所有 Tab 补全选项。默认情况下,它以与 相同的格式列出,但ls
我希望它以更内联的方式列出选项ls -l
。这可能吗?
我也有兴趣看看是否可以通过这种方式进行进一步的定制,尽管我不确定我想要什么,但一些想法的例子也很酷。
答案1
答案是,不是。
原因:
“set” 或 “shopt” 中没有选项来指定 tab 补全建议的输出格式。唯一的例外是列environ,但是,您不能将其更改为其他值。
对于自定义补全(如 --option 补全),您可以覆盖补全函数并将其输出到 stdout/stderr,以显示类似内容以及补全建议。但是,文件名补全是硬编码的,您无法通过内置函数
ls -l
覆盖它。complete
下面是一个简短的脏示例,用于显示详细信息以及制表符补全建议。假设您有一个程序foo
,它接受四个选项bar
、barr
、barrr
、car
,脏补全函数将是:
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