使用 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
(选项multios
和no_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
某些原因会导致所需的扩展失败。
由于我想继续使用viins
和vicmd
键映射,我的解决方案是将选项卡行为更改为complete-word
:
bindkey -M viins "\CI" complete-word
bindkey -M vicmd "\CI" complete-word
太长了;博士
如果您使用viins
或viicmd
作为键盘映射,请记住更改^I
为complete-word
:
bindkey -M viins "\CI" complete-word
bindkey -M vicmd "\CI" complete-word