我正在完成一个带有“一:二:三”之类的参数的命令。

用最简单的术语来说,我希望像默认情况下的空格字符一样处理 ':'。有没有一种简单的方法可以做到这一点,我错过了?

我发现 ':' 在 COMP_WORDBREAKS 中,但 COMP_WORDBREAKS 中的字符也被视为单词。

所以如果命令行是:

cmd one:tw[TAB]

COMP_CWORD 将为 3,COMP_WORDS[COMP_CWORD-1] 将为 ':'

为了比较,如果命令行是:
cmd one tw[TAB]

COMP_CWORD 将为 2,COMP_WORDS[COMP_CWORD-1] 将为“1”

更糟糕的是,如果你在 ':' 分隔符之后直接点击 [TAB],它的作用就像一个空格:
cmd one:[TAB]

现在 COMP_CWORD 将为 2,COMP_WORDS[COMP_CWORD-1] 将为“1”。

我可以很容易地从 COMP_LINE 自己解析命令行,但更好的是找到一种方法来让 ':' 在我的自定义完成中表现得像 ' '。可能的?

最佳答案

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

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

关于没有空格分隔的单词的 Bash 完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6787607/

10-14 14:24