Bash完成,无空格分隔词

Bash完成,无空格分隔词,bash,bash-completion,Bash,Bash Completion,我正在完成一个命令的编写工作,这个命令需要像“一:二:三”这样的参数 最简单的说,我希望“:”的处理方式与默认情况下空格字符的处理方式相同。有没有一个简单的方法可以做到这一点,我错过了 我发现“:”在COMP_分词中,但COMP_分词中的字符也被视为单词 因此,如果命令行是: cmd one:tw[TAB] cmd one tw[TAB] COMP_CWORD将是3,COMP_WORDS[COMP_CWORD-1]将是':' 为了进行比较,如果命令行为: cmd one:tw[TAB] c

我正在完成一个命令的编写工作,这个命令需要像“一:二:三”这样的参数

最简单的说,我希望“:”的处理方式与默认情况下空格字符的处理方式相同。有没有一个简单的方法可以做到这一点,我错过了

我发现“:”在COMP_分词中,但COMP_分词中的字符也被视为单词

因此,如果命令行是:

cmd one:tw[TAB]
cmd one tw[TAB]
COMP_CWORD将是3,COMP_WORDS[COMP_CWORD-1]将是':'

为了进行比较,如果命令行为:

cmd one:tw[TAB]
cmd one tw[TAB]
COMP_CWORD将是2,COMP_WORDS[COMP_CWORD-1]将是“一”

更糟糕的是,如果您在“:”分隔符后面点击[TAB],它的行为基本上就像一个空格:

cmd one:[TAB]
现在COMP\u CWORD将是2,COMP\u WORDS[COMP_ucword-1]将是“one”


我自己可以很容易地从COMP_行解析命令行,但更好的是找到一种方法,在我的自定义完成中使“:”像“”一样。可能吗?

首先采用自定义解析解决方案。我很想知道是否有更好的方法:

parms=$(echo "$COMP_LINE" | cut -d ' ' -f 2)
vals="${parms}XYZZY"
IFS=$":"
words=( $vals )
unset IFS
count=${#words[@]}
cur="${words[$count-1]%%XYZZY}"

不幸的是,事实并非如此。这实际上是bash的一个“特性”

虽然您可以修改
COMP_分词
,但修改
COMP_分词
可能会导致其他问题,因为它是一个全局变量,并且会影响其他完成脚本的行为

如果您看一下,有两种帮助器方法可以帮助您实现这一点:

  • \u get\u comp\u words\u by\u ref
    使用-n选项获取要完成的单词,而不将EXCLUDE中的字符视为分词
  • \u ltrim\u colon\u completions
    从压缩项中删除包含前缀的冒号
例如:

{
    local cur
    _get_comp_words_by_ref -n : cur
    __ltrim_colon_completions "$cur"
}
complete -F _thing thing