我几乎可以工作,但并不完全。
这会选择命令,但会立即运行:
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就可以了,但它不起作用。
答案 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
内置函数,专注于“显示或操作历史列表。”
# 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,则用户有机会重新编辑失败的历史替换。