【问题标题】:Can bash autocompletion span an equal signbash自动完成可以跨越一个等号吗
【发布时间】:2014-09-16 19:10:25
【问题描述】:

我想知道是否可以使自动完成跨越 = 符号。因此,例如,我想输入foo BAR=[TAB][TAB],并让它填写BAR 的可能值。我尝试了以下方法:我有一个名为“bar”的文件,如下所示:

#!/bin/bash
echo -e "BAR=100\nBAR=110\nBAR=200" | grep "^$2"

然后我做:

~> complete -C bar foo

如果我输入foo [TAB][TAB],它会给我一些可能的 BAR 值。如果我输入foo BAR=[TAB][TAB],它会失败(它将BAR=BAR= 附加到命令的末尾)。 (注意,如果我输入bar 1 BAR=,它会给我一个正确的完成列表,所以这不是条形脚本的问题)。

这对于我拥有的一些脚本非常有用。

【问题讨论】:

  • 我不确定您的意思,但据我所知,您的问题的答案可能是“否”。如果您在问题中明确说明您到底要做什么以及为什么这种行为会有用,那将会很有用,因为无论如何可能有更好的方法来解决它。
  • 我认为这就是COMP_WORDBREAKS 的用途,尽管你不能真的去改变它。所以问题是有没有办法解决这种行为,比如this question about :
  • Tom:我有一个有点复杂的makefile,它接收几个配置文件中的一个,这些配置文件位于另一个目录中。文件列表有些动态,所以我不能为每个目标制定规则。相反,目标是在 make 行上指定的:make target=.... 如果有这个自动完成功能会很好。还有一些其他的宏可以设置,如果对这些宏也有自动补全功能就好了。
  • 几乎在那里...如果 = 被视为断字,我想我可以检查前一个单词,看看它是否是 BAR,并基于此自动完成...仅在第一个之后= 符号后的字符,$3 变为 = 而不是 BAR...等等!

标签: bash bash-completion


【解决方案1】:

创建一个函数(例如在您的 .bashrc 中):

bar()
{
  local POS=${COMP_WORDS[COMP_CWORD]}
  if [ "${COMP_WORDS[1]}" = "BAR" ] && [ $COMP_CWORD -eq 3 ]; then
    COMPREPLY=($(echo -e "100\n110\n200" | grep ^$POS ))
  fi
}

并将函数链接到命令 foo:

complete -F bar foo

【讨论】:

  • 这行得通,只是它似乎修改了全局 COMP_WORDBREAKS,我担心这会对其他应用程序产生不利影响。
  • 我已经更新了我的答案。缺点:您必须在= 之后输入至少一个有效字符。
猜你喜欢
  • 2017-07-03
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-22
  • 2010-10-14
相关资源
最近更新 更多