使用 multios 时展开小于号并大括号展开

使用 multios 时展开小于号并大括号展开

使用 zsh multios set ( setopt multios) 可以执行以下操作:

< in1 < in2 > out

和:

< in > out1 > out2

这非常方便。

我想将此功能与大括号展开 ( setopt braceexpand) 结合起来,所以当我说:

<in{1,2}^I

^I是一个文字选项卡并调用完成系统),我希望它扩展到:

<in1 <in2 

但我得到的是:

<in1 in2

有没有简单的方法来修改这种行为?

答案1

您所需的行为会自动与我现有的完成设置(这些设置是通过compinstall几次缓慢生成的)一起工作,因此我花了一些时间来缩小负责的特定设置的范围。

核心功能由“完成者”提供_expand。你可以这样包含它:

zstyle ':completion:*' completer _expand

如果您还使用_completer完成器,则_expand需要首先列出。例如,这是我的实际完成者设置:

zstyle ':completion:*' completer _expand _complete _ignored _match _approximate _prefix

接下来,要启用大括号扩展,您需要substitute启用。默认情况下启用此功能,但您可以像这样明确说明:

zstyle ':completion:*' substitute 1

如果您不想在任何地方启用此功能,您可以全局禁用它并仅启用它,如下所示_expand

zstyle ':completion:*' substitute 0
zstyle ':completion:*:expand:*' substitute 1

我测试了这个桀骜版本 4.3.11 和 5.0.2 通过启动一个新的 shell 并zsh -df获取包含以下内容的文件:

zstyle ':completion:*' completer _expand
zstyle ':completion:*' substitute 0
zstyle ':completion:*:expand:*' substitute 1
autoload -Uz compinit
compinit

(选项multiosno_ingore_brace(这是brace_expand别名)是默认值,因此我不必显式更改它们。)

然后,我输入cat <in{1,2}并按下 Tab 键。您需要按几次 Tab:一次按每个扩展变体,再按一次才能进入“所有扩展”条目(上例总共按三次);我没有找到办法让这个特定的条目排在第一位。

答案2

这是我正在使用的完整设置:

zstyle ':completion:*' completer _complete _list _expand _oldlist _ignored _match _correct _approximate _prefix

替代设置是默认设置,即 1。

看到克里斯的回答和正确方向的指示,让我意识到这一定与我的配置有关。

我开始研究完成者顺序和替代设置,但这些都没有改变行为。使用 Chris 提供的最小配置文件与我自己的设置进行比较,我将问题范围缩小到我的 bindkey 文件,然后从那里缩小到bindkey -v.这会产生副作用,^I因为expand-or-complete某些原因会导致所需的扩展失败。

由于我想继续使用viinsvicmd键映射,我的解决方案是将选项卡行为更改为complete-word

bindkey -M viins "\CI" complete-word
bindkey -M vicmd "\CI" complete-word

太长了;博士

如果您使用viinsviicmd作为键盘映射,请记住更改^Icomplete-word

bindkey -M viins "\CI" complete-word
bindkey -M vicmd "\CI" complete-word

相关内容