得到bash历史到vi

ult*_*ian 10 vim bash

当我尝试将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)

  • @hasenj 傻瓜们想跳出框框思考吗? (2认同)

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在写入文件时将其剪切掉; 这仍然会输出每个条目的索引.我猜你可以筛选出的道路上进入过的文件,通过其管道sedcut或船员之一.但是从vim内部执行此操作非常容易(假设您了解正则表达式的基础知识;如果不知道,请从:help :substitute或开始查找正则表达式教程).

请注意,如果您从〜/ .bash_history中读取行,则只能从已完成的 bash shell中获取历史记录,即您键入exit并关闭终端窗口.所以你在启动vim之前输入的任何命令都不会出现.你可以改变它的工作方式,但最后你会得到来自不同会话的命令,这些命令在历史记录中混杂在一起.


the*_*osp 7

: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可能输出的转义字符(发生在我的系统上).