从终端获取fzf的输出而不执行它

时间:2017-07-06 06:33:54

标签: bash terminal fzf

fzf岩石!我想用它来搜索bash历史。找到匹配项后,我希望将其放在命令行上,但 已执行,因此我可以进一步编辑它。 (所有这些都是源于bash的函数或脚本,因此它可以访问我的历史记录。)

我几乎可以工作,但并不完全。

这会选择命令,但会立即运行:

eval $(history | "$HOME/bin/fzf" +s | sed 's/ *[0-9]* *//')

这会把它放到我的剪贴板中,但是当我粘贴它时,它仍然以空格和换行结束,因此它会立即执行。

history | "$HOME/bin/fzf" +s | sed 's/ *[0-9]* *//' | xclip -se c

我还尝试了几种变体,包括

history | "$HOME/bin/fzf" +s | sed -e 's/ *[0-9]* *//' -e 's/$//' | xclip -se c

具有相同的结果。

这实际上有效,但我仍然需要将它放在剪贴板中,然后手动粘贴它。

history | "$HOME/bin/fzf" +s | sed -re 's/ *[0-9]* *//' | awk '{printf "%s", $0}' | xclip -se c

如何在一步中完成此操作 - 无需手动粘贴?

我认为离开xclip就可以了,但它不起作用。

4 个答案:

答案 0 :(得分:1)

在当前的fzf版本中,您可以使用ctrl-r从命令行执行此操作。来自the readme

CTRL-R-将历史记录中的选定命令粘贴到命令行上

答案 1 :(得分:0)

我觉得junegunn已经为你解决了这个问题。 In this file他用完全相同的功能取代了bash ctrl-r。由于行fzf-file-widget输出sh: ``fzf-file-widget': not a valid identifier,我确实在采购此文件方面遇到了一个小问题,但在更改fzf_file_widget之后,它确实很有效。

答案 2 :(得分:0)

我没有意识到这从来没有得到完全的回答。我最终写了一个位于$ HOME / .bashrc中的函数。

它仍然需要按粘贴(Ctrl + Shift + v)才能在命令行上获得结果。

# fh - repeat history
fh () 
{ 
    history | tac | "$HOME/bin/fzf" +s | sed -re 's/ *[0-9]* *//' | awk '{printf "%s", $0}' | xclip -se c
}

它将选定的命令行保留在剪贴板中,因此您可以将其粘贴到命令行中以进行进一步的编辑和执行。

它将CLI历史记录传送到tac中,这将颠倒顺序,以便首先显示最新命令(最后显示)并将其发送到fzf+s告诉fzf不要再次对输出进行排序。接下来,sed用于从结果中剥离命令号前缀。然后,它通过awk来删除命令中的尾随换行符,因此它不会在粘贴后立即运行。最后,xclip用于将选择内容放入剪贴板。

最后,我添加

bind '"\C-F":" fh\n"'  # fzf history on ctrl+F

.bashrc以将函数绑定到Ctrl+f,以使其易于使用和记忆。

我在绑定的fh命令中添加了一个前导空格,以便在调用它时不会将其添加到命令历史记录中。

答案 3 :(得分:0)

fzf 已准备好在 @sudavid4 提到的 fzf's key-bindings.bash 中安装此功能。 __fzf_history__ 函数使用 fzf 以交互方式搜索 bash 历史记录。

在默认历史处理中(尽管 fzf 的功能不需要),通过设置 histverify 启用选择后编辑。来自man bash

<块引用>

历史验证

如果设置,并且正在使用 readline,则历史替换的结果不会立即传递给 shell 解析器。相反,结果行被加载到 readline 编辑缓冲区中,允许进一步修改。

最后,bash 的内置 fc(通过 help 了解更多信息,而不是 man),除了支持“显示[ing] 或从历史列表中执行[ing] 命令” history 内置函数,专注于“显示或操作历史列表。”


还要注意...

fzf's key-bind.bash 片段:

  # CTRL-R - Paste the selected command from history into the command line
  bind -m emacs-standard -x '"\C-r": __fzf_history__'
  bind -m vi-command -x '"\C-r": __fzf_history__'
  bind -m vi-insert -x '"\C-r": __fzf_history__'

具有相关但不同目的的相邻 bash shopt(shell 选项):

<块引用>

历史记录

如果设置了并且正在使用 readline,则用户有机会重新编辑失败的历史替换。