0

我想做这样的事情:

function invim () {
  vim $(!!)
}

但是,当我运行它时,它说: invim:1: command not found: !!

我认为这是因为!!交互式 shell 扩展在非交互式脚本/函数中不可用。在 bash 中,我可以使用该history命令来完成此操作,但是当我尝试使用它时,它似乎劫持了我的 readline 并且不再允许向上箭头完成工作。

任何帮助表示赞赏!

4

2 回答 2

2

(注意:这不是一个完整的答案;请参阅评论和https://stackoverflow.com/a/70285039/9307265


关联数组中提供了最近的命令history,因此这应该类似于您问题中的函数:

function invim {
    vim ${history[@][1]}
}

history[@]扩展从关联数组中获取命令,同时引用[1]第一项,保证是最新的。

但这可能并不完全符合您的要求。与, 不同bashzsh不会将变量扩展重新解析为单词,因此在调用后立即执行该函数foo --opt将导致尝试编辑名为 的文件foo --opt,该文件可能不存在。我们可以通过使用单词扩展来获得第一个单词,将其转换为带有参数扩展标志${=...}的数组,然后添加另一个索引运算符。(A)[1]

此外,在许多情况下,此函数只会在当前目录中找到一个文件。使用:c修饰符,该函数可以搜索PATH并找到源文件。

把它们放在一起:

function invim {
    vim ${${(A)=history[@][1]}[1]:c}
}
于 2021-12-09T04:09:18.103 回答
1

将 Gairfowl 的答案与关联数组一起使用,我能够制定出合适的解决方案:

function invim {                                              
    vim $(bash -c ${history[@][1]})            
}

以下是它的工作原理:

  1. ${history[@][1]}是最新命令的文本,例如,find . -type f -name "*.txt"
  2. 使用在 shell 中运行该命令bash -c
  3. 生成的标准输出由封闭的 捕获$(),然后作为文件名传递给 vim 以进行编辑。这里没有封闭引号以允许打开多行输出。
于 2021-12-09T05:17:32.127 回答