当我尝试将bash历史记录读入vim时,我什么都没得到。
:r !history
如果我只是执行命令,即
:!history
而不是历史我在我开始使用vim之前看到了终端的快照。
如何将“历史记录”的输出读入vim?读取.bash_history的内容不会像我使用时间戳保存历史记录那样:
HISTTIMEFORMAT='%Y.%m.%d %R '
答案 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
将其剪切掉;这仍然会输出每个条目的索引。我猜你也可以通过sed
或cut
或其中一名工作人员将其过滤到文件中。但是从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