答案1
您可以为此使用自定义 zle 小部件并通过键绑定调用它,例如Alt+ Tab(与Esc,相同Tab)
expand-to-output () {
BUFFER='$('$BUFFER')'
CURSOR=0
zle redisplay
zle expand-word
}
zle -N expand-to-output
bindkey "^[^I" expand-to-output
现在,如果你输入任何命令后跟Alt+ Tab,整个命令将被其输出替换,如果命令可以成功运行。如果命令无法成功运行,则键入的命令行将仅被包围$(...)
但不会展开。如果有错误消息,则应将其打印在编辑缓冲区上方。这可能无法可靠地与多行提示配合使用。
解释:
expand-to-output () {...}
定义(新)expand-to-output
函数。BUFFER
包含当前命令行BUFFER='$('$BUFFER')'
位于命令行$(
前后。相当于但可以嵌套。)
$(...)
`...`
CURSOR
是命令行上光标的位置CURSOR=0
将光标置于(已编辑的)命令行的开头,即 上$
。如果不将光标移到那里,则可能会zsh
尝试扩展 中的单词,$(...)
而不是整个过程替换。zle redisplay
重新显示编辑缓冲区。这可以防止扩展命令打印某些内容时出现显示错误标准错误. (注意:多行提示可能会出现一些问题)zle expand-word
调用expand-word
小部件,该小部件通常作为 Tab 补全的一部分被调用。zle -N expand-to-output
将该函数注册为同名的小部件。bindkey "^[^I" expand-to-output
将小部件绑定expand-to-output
到Alt+ Tab。