1

我在网上找到了一个不错的 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

我尝试用 替换evalecho这更好,但没有给我编辑命令。有没有办法在 bash/zsh 中做到这一点?

是一个相关的线程,有一个使用建议xvkbd,但我希望有更简单的东西。

4

2 回答 2

1

我最终使用了这个:

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

即静默打印,然后是向上箭头,它会调出编辑命令。很想听听是否有更简单的方法。

于 2020-12-05T18:14:58.300 回答
1

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

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
于 2020-12-04T07:31:26.840 回答