创建可扩展命令

米杜

我通过Oh-my-zsh使用ZSH,我看到的一个简洁功能是,当命令位于反引号中时,shell会扩展它们的命令。

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

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

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

明确地说,我不是在谈论将参数扩展到命令,而是命令本身。


这确实是一个了不起的功能,但并不是我一直在寻找的功能。除非我做错了什么,否则这会将我的别名扩展到定义别名的目的,而不是结果的含义。例如这里:

在此处输入图片说明

我想查看该命令而不是完整命令的结果。

阿达芬

您可以为此使用自定义的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将光标放在(已编辑)命令行的开头,即on上$如果不将光标移到该位置,则可能会zsh尝试在其中扩展单词$(...)而不是整个过程替换。
  • zle redisplay重新显示编辑缓冲区。如果扩展的命令将某些内容打印到stderr,这可以防止显示错误(注意:多行提示可能存在一些问题)
  • zle expand-word调用expand-word小部件,通常通常将其称为Tab补全的一部分。
  • zle -N expand-to-output 将函数注册为同名的小部件。
  • bindkey "^[^I" expand-to-outputexpand-to-output小部件绑定Alt+ Tab

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章