我最近从 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 文件名扩展,而Tab和all-matches
使用完成上下文来确定如何处理通配符。例如, after rmdir *
,^X*
扩展到所有文件,而^Xa
仅扩展到目录。