当我尝试将bash历史读入vim时,我什么都没得到.
:r !history
Run Code Online (Sandbox Code Playgroud)
如果我只是执行命令,即
:!history
Run Code Online (Sandbox Code Playgroud)
而不是历史,我得到了我的终端的快照,因为它在我开始使用vim之前.
如何将"历史"的输出读入vim?读取.bash_history的内容将无法执行,因为我使用时间戳保存历史记录:
HISTTIMEFORMAT='%Y.%m.%d %R '
Run Code Online (Sandbox Code Playgroud)
Rob*_*ser 19
从shell提示符:
history | vim -
Run Code Online (Sandbox Code Playgroud)
int*_*ted 13
问题是,历史只能由启动vim的bash shell知道.当你:!history在vim中执行时,你将启动一个新的bash shell,它有自己的历史记录,这是空的,这就是为什么你只看到你启动vim时看到的屏幕:它输出历史记录中的所有行,这是一个总计为零的总数.这实际上是过于简单化了,但无论如何你都无法获得你在以这种方式启动vim之前输入的命令的历史记录.
如果你想在不退出vim的情况下获得这些历史记录,你可以通过按CTRL-Z下来暂停vim ,然后使用将历史记录写入文件history >history.tmp.然后键入fg 1以恢复vim:这将告诉bash将焦点转移回其"作业号1",这通常是vim.按CTRL-Z后显示作业编号:
[1]+ Stopped vim
Run Code Online (Sandbox Code Playgroud)
因此,如果括号中的数字不是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'
Run Code Online (Sandbox Code Playgroud)
history命令仅适用于交互式shell.
第一部分:
echo "history" | bash -i 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
强制交互式shell(并删除不输出历史记录的行).
第二部分:
sed -e 's/\x1b\[.//g'
Run Code Online (Sandbox Code Playgroud)
删除shell可能输出的转义字符(发生在我的系统上).
| 归档时间: |
|
| 查看次数: |
5546 次 |
| 最近记录: |