获取Bash历史记录到Vi

22

当我尝试将bash历史记录读入vim时,什么也没有显示。

:r !history

如果我只是执行命令,即

:!history

我在vim中获取快照时,输出的是终端启动前的状态而非历史记录。

如何将"history"的输出读入到vim中?读取.bash_history文件的内容行不通,因为我保存了带有时间戳的历史记录:

HISTTIMEFORMAT='%Y.%m.%d %R  '

哦,历史记录似乎有一些特殊的语义。尝试回答时我注意到bash -c history没有输出任何东西。很奇怪... - R Samuel Klatchko
5个回答

28
从命令行提示符中:
history | vim -

1
太棒了!这是一个典型的创新思维案例。此外,这是唯一一个包含当前 shell 的未保存历史记录的解决方案。 - ultracrepidarian
1
@nameanyone,怎么能同时做到教科书和超越常规呢? ;) - hasen
2
@hasenj 为外行人提供创新思维? - n611x007
正是我正在寻找的想法。更进一步,这也将使您到达历史记录的最后一行,因此结果与运行 history 相同,不同之处在于您处于 vim 界面:history | vim "+normal G$" - - George Dimitriadis

20
问题是,vim只知道启动它的bash shell的历史记录。当你在vim中输入:!history时,你启动了一个新的bash shell,它有自己的历史记录,而且是空的,因此你只能看到vim启动时的屏幕内容:它输出了它的历史记录中的所有行,而这个历史记录一共为零。这其实是一个过于简化的说法,但无论如何,你无法通过这种方式获取刚刚在启动vim之前输入的命令历史。
如果你想在不退出vim的情况下获取那些历史记录,你可以按CTRL-Z键暂停vim,然后使用history > history.tmp将历史记录写入文件。然后输入fg 1以恢复vim:这将告诉bash将焦点转回"作业号1",通常就是vim。作业号会在你按下CTRL-Z后显示出来:
[1]+  Stopped                 vim

如果方括号中有数字1以外的数字,那么你应该使用fg加上对应的数字。当你回到vim之后,只需输入:tabedit history.tmp就可以在新标签页中打开保存的历史记录(例如)。

输出结果中还会有时间戳,但因为你在vim中,所以可以轻松地用:substitute命令过滤掉它们。或者,在写入文件时使用HISTTIMESTAMP ='' history,而不是只用history,这样仍然会输出每个条目的索引。我猜你也可以通过管道符将其传输到sedcut等工具中进行过滤。但在vim中做这件事真的很容易(假设你知道正则表达式的基础;如果不知道,请从:help :substitute开始或者去找一个正则表达式教程)。

请注意,如果从~/.bash_history读取行,你只能获得已经完成的bash shell的历史记录,即你键入了exit并关闭了终端窗口。因此,你在启动vim之前键入的任何命令都不会在历史记录中。你可以改变这种行为,但这样就会将来自不同会话的命令混在一起。


13
:r!echo "history" | bash -i 2>/dev/null | sed -e 's/\x1b\[.//g'

说明:

history 命令只在交互式 shell 中有效。

第一部分:

echo "history" | bash -i 2>/dev/null

强制使用交互式 shell(并删除不是历史记录输出的行)。

第二部分:

sed -e 's/\x1b\[.//g'

移除可能在 shell 中输出的转义字符(在我的系统上发生过)。


我非常喜欢这个答案。这是一个很巧妙的技巧,我相信在许多情况下都会派上用场。如果我可以接受两个答案,我一定会这么做。 - ultracrepidarian
最佳答案!:r!echo "history" | bash -i 2>/dev/null | cut -c 8- | tail -n 4 - Yordan Georgiev

4

您可以预先编写当前会话的历史记录:
history -w
然后在编辑器中,您可以获取最近的20个历史命令:
:r ! tail -20 ~/.bash_history


1

尝试:

r !set -o history; HISTFILE=~/.bash_history; history -r; history 10

这将包括时间戳,并且不会包括尚未保存到历史文件的历史记录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接