创建可扩展命令

创建可扩展命令

我通过 Oh-my-zsh 使用 ZSH,我看到的一个巧妙的功能是,当我的命令以反引号形式出现时,shell 会扩展它们。

例如,`pwd`+tab替换`pwd`为我的当前路径:

https://infinit.io/_/DjmxTCK.gif

我想知道是否有一种相对简单的方法可以对某些命令执行相同操作而无需使用反引号。我想将其应用于某些别名(或函数)。

需要明确的是,我不是谈论扩展命令的参数,而是命令本身。


这是一个非常了不起的功能,但并不是我所寻找的。除非我做错了什么,否则这会将我的别名扩展为别名定义的内容,但不会扩展为结果。例如这里:

在此处输入图片描述

我希望看到该命令的结果而不是完整命令。

答案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-outputAlt+ Tab

相关内容