得到bash历史到vi

时间:2010-03-25 00:04:05

标签: bash vim

当我尝试将bash历史记录读入vim时,我什么都没得到。

:r !history

如果我只是执行命令,即

:!history

而不是历史我在我开始使用vim之前看到了终端的快照。

如何将“历史记录”的输出读入vim?读取.bash_history的内容不会像我使用时间戳保存历史记录那样:

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

5 个答案:

答案 0 :(得分:19)

从shell提示符:

history | vim -

答案 1 :(得分:13)

问题是该历史记录只能由启动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之前输入的任何命令都不会出现。你可以改变它的工作方式,但最后你会得到来自不同会话的命令,这些命令在历史记录中混杂在一起。

答案 2 :(得分:7)

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

说明:

历史命令仅适用于交互式shell。

第一部分:

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

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

第二部分:

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

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

答案 3 :(得分:1)

尝试:

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

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

答案 4 :(得分:1)

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