4

我正在完成一个需要像“一:二:三”这样的参数的命令。

用最简单的术语来说,我希望 ':' 像默认的空格字符一样被处理。有没有一种我想念的简单方法来做到这一点?

我发现 ':' 在 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] 将为“一”

更糟糕的是,如果你在 ':' 定界符之后点击 [TAB],它的作用就像一个空格:

cmd one:[TAB]

现在 COMP_CWORD 将为 2 并且 COMP_WORDS[COMP_CWORD-1] 将为“一”。

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

4

2 回答 2

0

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

parms=$(echo "$COMP_LINE" | cut -d ' ' -f 2)
vals="${parms}XYZZY"
IFS=$":"
words=( $vals )
unset IFS
count=${#words[@]}
cur="${words[$count-1]%%XYZZY}"
于 2011-07-23T01:08:06.317 回答
0

不幸的是,并非如此。这实际上是 bash 的一个“功能”。

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

如果您查看bash-completion 的源代码,则存在两个可以帮助解决此问题的辅助方法:

  • _get_comp_words_by_ref使用 -n 选项可以完成单词而不将 EXCLUDE 中的字符视为分词
# Available VARNAMES:
#     cur         Return cur via $cur
#     prev        Return prev via $prev
#     words       Return words via $words
#     cword       Return cword via $cword
#
# Available OPTIONS:
#     -n EXCLUDE  Characters out of $COMP_WORDBREAKS which should NOT be
#                 considered word breaks. This is useful for things like scp
#                 where we want to return host:path and not only path, so we
#                 would pass the colon (:) as -n option in this case.
#     -c VARNAME  Return cur via $VARNAME
#     -p VARNAME  Return prev via $VARNAME
#     -w VARNAME  Return words via $VARNAME
#     -i VARNAME  Return cword via $VARNAME
#
  • __ltrim_colon_completions从 COMPREPLY 项中删除包含前缀的冒号
# word-to-complete.
# With a colon in COMP_WORDBREAKS, words containing
# colons are always completed as entire words if the word to complete contains
# a colon.  This function fixes this, by removing the colon-containing-prefix
# from COMPREPLY items.
# The preferred solution is to remove the colon (:) from COMP_WORDBREAKS in
# your .bashrc:
#
#    # Remove colon (:) from list of word completion separators
#    COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
#
# See also: Bash FAQ - E13) Why does filename completion misbehave if a colon
# appears in the filename? - http://tiswww.case.edu/php/chet/bash/FAQ
# @param $1 current word to complete (cur)
# @modifies global array $COMPREPLY

例如:

{
    local cur
    _get_comp_words_by_ref -n : cur
    __ltrim_colon_completions "$cur"
}
complete -F _thing thing
于 2019-08-09T21:41:33.747 回答