当我尝试将bash历史记录读入vim时,什么也没有显示。
:r !history
如果我只是执行命令,即
:!history
我在vim中获取快照时,输出的是终端启动前的状态而非历史记录。
如何将"history"的输出读入到vim中?读取.bash_history文件的内容行不通,因为我保存了带有时间戳的历史记录:
HISTTIMEFORMAT='%Y.%m.%d %R '
history | vim -
history
相同,不同之处在于您处于 vim 界面:history | vim "+normal G$" -
。 - George Dimitriadis:!history
时,你启动了一个新的bash shell,它有自己的历史记录,而且是空的,因此你只能看到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之前键入的任何命令都不会在历史记录中。你可以改变这种行为,但这样就会将来自不同会话的命令混在一起。
: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 中输出的转义字符(在我的系统上发生过)。
您可以预先编写当前会话的历史记录:
history -w
然后在编辑器中,您可以获取最近的20个历史命令:
:r ! tail -20 ~/.bash_history
尝试:
r !set -o history; HISTFILE=~/.bash_history; history -r; history 10
bash -c history
没有输出任何东西。很奇怪... - R Samuel Klatchko