我想做这样的事情:
function invim () {
vim $(!!)
}
但是,当我运行它时,它说:
invim:1: command not found: !!
我认为这是因为!!
交互式 shell 扩展在非交互式脚本/函数中不可用。在 bash 中,我可以使用该history
命令来完成此操作,但是当我尝试使用它时,它似乎劫持了我的 readline 并且不再允许向上箭头完成工作。
任何帮助表示赞赏!
(注意:这不是一个完整的答案;请参阅评论和https://stackoverflow.com/a/70285039/9307265)
关联数组中提供了最近的命令history
,因此这应该类似于您问题中的函数:
function invim {
vim ${history[@][1]}
}
history[@]
扩展从关联数组中获取命令,同时引用[1]
第一项,保证是最新的。
但这可能并不完全符合您的要求。与, 不同bash
,zsh
不会将变量扩展重新解析为单词,因此在调用后立即执行该函数foo --opt
将导致尝试编辑名为 的文件foo --opt
,该文件可能不存在。我们可以通过使用单词扩展来获得第一个单词,将其转换为带有参数扩展标志${=...}
的数组,然后添加另一个索引运算符。(A)
[1]
此外,在许多情况下,此函数只会在当前目录中找到一个文件。使用:c
修饰符,该函数可以搜索PATH
并找到源文件。
把它们放在一起:
function invim {
vim ${${(A)=history[@][1]}[1]:c}
}
将 Gairfowl 的答案与关联数组一起使用,我能够制定出合适的解决方案:
function invim {
vim $(bash -c ${history[@][1]})
}
以下是它的工作原理:
${history[@][1]}
是最新命令的文本,例如,find . -type f -name "*.txt"
bash -c
$()
,然后作为文件名传递给 vim 以进行编辑。这里没有封闭引号以允许打开多行输出。