在非选项(nodash)输入后修复zsh_参数选项(--无论什么)完成

在非选项(nodash)输入后修复zsh_参数选项(--无论什么)完成,zsh,completion,Zsh,Completion,我想允许在中的其他输入之后完成--标志,但是\u参数似乎需要这样做 描述选项标志的规范必须位于描述所分析行的非选项(“位置”或“正常”)参数的规范之前(从) 换句话说:command-foo--o[TAB]什么也不做,但是command--o[TAB]工作正常。有没有办法配置\u参数或者我需要使用其他参数 注意:在我的例子中,单独的完成函数似乎不是一个选项,因为输入不在固定列表中(gradle任务是任意的,可以指定多个,gradle myfoo mybar--o[TAB]必须工作)。因此您希望能

我想允许在中的其他输入之后完成
--标志
,但是
\u参数
似乎需要这样做

描述选项标志的规范必须位于描述所分析行的非选项(“位置”或“正常”)参数的规范之前(从)

换句话说:
command-foo--o[TAB]
什么也不做,但是
command--o[TAB]
工作正常。有没有办法配置
\u参数
或者我需要使用其他参数


注意:在我的例子中,单独的完成函数似乎不是一个选项,因为输入不在固定列表中(gradle任务是任意的,可以指定多个,
gradle myfoo mybar--o[TAB]
必须工作)。

因此您希望能够键入类似于
vim foo-[TAB]的内容
并有一个列表自动展开以显示标志和开关,其中当前必须键入
vim-[TAB]
以获取标志和开关,然后键入
foo
,是吗

希望我能正确理解你的问题

我目前的zsh完成选项可能会对此有所帮助,因为我可以做我所描述的,这似乎是您所要求的?我已经花了相当长的时间来设置这些,所以我不记得每个人都做了什么。但我相信您需要的是WORD中的
setopt COMPLETE\u
unset LIST\u fuzzalize
,以及
zstyle':completion::approximate*:*'前缀required false
选项。如果我错了,请有人纠正我

我已将我在zsh中使用的内容作为我的完成部分。我已经独立测试了它,它可以在我的zsh上正常工作

#{{{ Completion Stuff
zmodload -i zsh/complist
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
bindkey -M viins '\C-i' complete-word
# Faster! (?)
zstyle ':completion::complete:*' use-cache 1
# case insensitive completion
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' \
  'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format '%B%d%b'
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format 'No matches for: %d'
zstyle ':completion:*' group-name ''
# generate descriptions with magic.
zstyle ':completion:*' auto-description 'specify: %d'
# Don't prompt for a huge list, page it!
zstyle ':completion:*:default' list-prompt '%S%M matches%s'
# Don't prompt for a huge list, menu it!
zstyle ':completion:*:default' menu 'select=0'
# Have the newer files last so I see them first
zstyle ':completion:*' file-sort modification reverse
# color code completion
zstyle ':completion:*' list-colors "=(#b) #([0-9]#)*=36=31"
unsetopt LIST_AMBIGUOUS
setopt  COMPLETE_IN_WORD
# Separate man page sections.
zstyle ':completion:*:manuals' separate-sections true
#
zstyle ':completion:*' list-separator 'fREW'
# complete with a menu for xwindow ids
zstyle ':completion:*:windows' menu on=0
zstyle ':completion:*:expand:*' tag-order all-expansions
# more errors allowed for large words and fewer for small words
zstyle ':completion:*:approximate:*' max-errors 'reply=(  $((  ($#PREFIX+$#SUFFIX)/3  ))  )'
# Errors format
zstyle ':completion:*:corrections' format '%B%d (errors %e)%b'
# Don't complete stuff already on the line
zstyle ':completion::*:(rm|vi):*' ignore-line true
# Don't complete directory we are already in (../here)
zstyle ':completion:*' ignore-parents parent pwd
zstyle ':completion::approximate*:*' prefix-needed false

我能够解决这个问题,至少在指定一个任务后允许选项

诀窍是使用
:->statename
设置
\u参数
中的状态,将上下文重置为下一个单词,并提供匹配非命令词的通配符匹配器,然后再次使用
\u参数


几乎可以肯定的是,有一种方法可以允许在任意字数后指定选项,并避免某些重复,但这是一个可行的开始。

看看git完成函数,它们的工作原理是这样的(
git clone--[TAB]
例如(
--bare,--branch,
)@TomRegner这是一个好主意-我将给出一个快照。Git completion()使用每个子命令的完成函数(例如,
\u Git\u clone()
)。在我的例子中,Gradle任务列表是动态的,可以指定多个任务,因此使用相同的方法似乎不可行。“我将把这一点补充到问题上。”汤姆雷格纳再看一眼,你的建议是正确的。Git允许任意的分支名称(比如说在Git checkout之后),并在之后提供选项的完成。我可以使用git completion的逻辑来实现下面的答案。非常感谢。很酷!我喜欢;-)我想你部分理解了我的问题。听起来你是在建议我使用
setopt
zstyle
命令配置完成脚本,但我感觉到你认为我正在接近我的个人zsh配置。我的目的是为我们的Gradle用户提供更好的完成脚本。我不想将其配置为任何完成,我特别想为gradle完成解决这个问题。