如何编写bash自动补全脚本(4)

如果我们需要为机器上的所有用户启动这个自动补全脚本,可以将该脚本复制到/etc/bash_completion.d/目录中,这样bash会自动加载。

最后调优

为了有更好的展示效果,额外增加几个步骤:)

在新行中展示每个条目

在我实际工作中编写的bash自动补全脚本中,补全建议也由两部分组成。我希望能够将第一部分用默认颜色展示,而第二部分用灰色展示,以告知用户这仅仅是帮助文本。以本教程为例,应该把数字用默认颜色展示,而命令文本用另一个不那么花哨的颜色展示。

不幸的是,目前为止这个功能还无法实现,因为自动补全项仅仅以纯文本方式展示,而不会处理其中的颜色指令(例如:\e[34mBlue)。

因此这里我们对于提升用户体验(也有可能没有提升:D)的方法是将每一个补全项换行显示。这个方案实现起来也没有那么方便,因为我们无法简单的通过在每个COMPREPLY项后追加换行符来实现。为了实现这个功能,这里采用了hach的方式将补全建议文本填充到控制台的宽度。

通过printf命令可以实现将字符串填充到指定长度。如果需要这项功能,将自动补全脚本做如下修改:

#/usr/bin/env bash _dothis_completions() { if [ "${#COMP_WORDS[@]}" != "2" ]; then return fi local IFS=$'\n' local suggestions=($(compgen -W "$(fc -l -50 | sed 's/\t//')" -- "${COMP_WORDS[1]}")) if [ "${#suggestions[@]}" == "1" ]; then local number="${suggestions[0]/%\ */}" COMPREPLY=("$number") else for i in "${!suggestions[@]}"; do suggestions[$i]="$(printf '%*s' "-$COLUMNS" "${suggestions[$i]}")" done COMPREPLY=("${suggestions[@]}") fi } complete -F _dothis_completions dothis

source并验证:

dothis <tab><tab> ... 499 source dothis-completion.bash 500 clear ... 503 dothis 500 可定制行为

在我们的之前的自动补全脚本中,将补全项数量写死了最后50个执行历史。这在实际使用中不太友好。我们应该让每个用户能够有自己的选择余地,如果他们没有选择,再使用默认值50。

为了实现这个功能,我们将检查是否设置了环境变量DOTHIS_COMPLETION_COMMANDS_NUMBER

最后一次修改自动补全脚本:

#/usr/bin/env bash _dothis_completions() { if [ "${#COMP_WORDS[@]}" != "2" ]; then return fi local commands_number=${DOTHIS_COMPLETION_COMMANDS_NUMBER:-50} local IFS=$'\n' local suggestions=($(compgen -W "$(fc -l -$commands_number | sed 's/\t//')" -- "${COMP_WORDS[1]}")) if [ "${#suggestions[@]}" == "1" ]; then local number="${suggestions[0]/%\ */}" COMPREPLY=("$number") else for i in "${!suggestions[@]}"; do suggestions[$i]="$(printf '%*s' "-$COLUMNS" "${suggestions[$i]}")" done COMPREPLY=("${suggestions[@]}") fi } complete -F _dothis_completions dothis

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7abde8daf5e5ef373eea3856d785025d.html