zsh:制作 foo* 立即展开 foo*

zsh:制作 foo* 立即展开 foo*

我最近从 bash 切换到 zsh。一个区别是,当我在 bash 中键入命令并执行 Esc-*(在 vi 编辑模式下)时,bash 将立即内联扩展 glob。例如,如果我输入:

$ ls
bar foo1 foo2 foo3
$ cp foo<Esc>*

bash 会将命令更改为:

$ cp foo1 foo2 foo3

并将光标定位在行尾并使我回到插入模式。我怎样才能让 zsh 做同样的事情?

答案1

在默认配置中,您可以从以下位置获得此效果expand-word在 Emacs 模式下它绑定到^X *( Ctrl+X *) (如果你想在 Vi 模式下使用它,你必须将它绑定到一个键)。ESC *与 bash不同, ^X *zsh 还扩展了变量和命令替换。

此外,在默认配置中,Tab在包含通配符的单词后按 会将其展开到匹配列表。

如果你有选择glob_complete打开,然后Tab循环遍历匹配项而不是插入所有匹配项。在这种情况下,您可以为_all_matches完成者(由史蒂芬·查泽拉斯评论)。引用手册中的示例代码:

setopt glob_complete
zle -C all-matches complete-word _generic
bindkey '^Xa' all-matches
zstyle ':completion:all-matches::::' completer _all_matches _complete
zstyle ':completion:all-matches:*' insert true

Tab完成小部件(默认和 this all-matches)和内置小部件之间的区别expand-word在于,expand-word无论完成上下文是什么,它都会进行 shell 文件名扩展,而Taball-matches使用完成上下文来确定如何处理通配符。例如, after rmdir *,^X*扩展到所有文件,而^Xa仅扩展到目录。

相关内容