将命令输出放在shell中以便进一步编辑

yuvru6vn  于 2023-04-21  发布在  Shell
关注(0)|答案(3)|浏览(92)

我在网上发现了一个很好的zsh命令,它使用fzf来模糊搜索shell历史:

fh() {
  eval $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed 's/ *[0-9]* *//')
}

但是,我不想使用eval-ing命令,而是想将它放在提示符中,并在运行它之前进一步编辑它,类似于:

$ fh grep
(search happens)
$ grep -RI foo .  <--- cursor

我试着用echo替换eval,这样更好,但没有给予我编辑的命令。在bash/zsh中有没有办法做到这一点?
Here是一个相关的线程,建议使用xvkbd,但我希望有更简单的东西。

ekqde3dh

ekqde3dh1#

您可以使用官方的shell集成。我使用zsh,所以我只是复制了提供的脚本并将其放入我的~/.zshrc中。这将为您提供您正在寻找的确切行为,例如返回命令并将结果放在输入行上,而不是在无法编辑的情况下运行命令。
注意:它会覆盖ctrl+r的快捷键来进行历史搜索,而不是把它放在别名或类似的地方,所以也许不是你想要的。但是也许你可以构建一个脚本来从那里工作。
https://github.com/junegunn/fzf/blob/master/shell/key-bindings.zsh

kuuvgm7e

kuuvgm7e2#

在zsh中,zsh行编辑器(ZLE)内置的vared将允许您编辑环境变量。
编辑后,更新后的变量可用于执行命令:

fh() {
  fzfresult=$( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed 's/ *[0-9]* *//')
  vared -p 'fzfout> ' -ac fzfresult
  ${fzfresult[@]}
}

vared命令中,-p设置提示符。-ac选项将fzfresult变量更改为数组,以便我们可以在下一步中执行它。
我没有安装fzf,所以没有完全测试,但结果应该是这样的:

% fh grep
fzfout> grep -RI foo .   <-- edit, hit enter, get output:
file1: text with foo
file4: more text with foobar
vq8itlhq

vq8itlhq3#

我最终使用了这个:

fh() {
   print -s $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed 's/ *[0-9]* *//')
}

即默默地打印,其次是向上箭头,这带来了编辑命令。很乐意听到,如果有一个更简单的方法。

相关问题