如果你想编辑整个历史记录

如果你想编辑整个历史记录

问题

我正在使用 oh-my-zsh 和 Antigen 来管理我的 Zsh。

有时我会不小心在 Zsh 中输入错误/失败的命令,这很烦人,因为zsh-autosuggestions 插件抛出这些命令。

例如,假设我输入的是 gut status而不是git status

现在,当我尝试再次输入正确的命令时,一旦我输入g,自动建议插件就会抛出,gut status因为这是最近历史记录中最接近的匹配。但这是一个失败的命令!

要做的就是防止这些失败的命令“污染”我的历史记录所以自动建议插件不会建议它们。

我做了什么

我搜索过这个问题,最接近的匹配方法是设置 HIST_IGNORE_SPACE,或者忽略特定命令的方法,或者在输入命令后手动删除命令。请参阅。但正如@Adaephon 52 指出的那样,这种情况事情已成。

我正在考虑做什么

我现在想编写一个函数,每次在 Zsh 中输入失败的命令时都会触发该函数,以从历史记录中删除最新条目。但是,我对 Zsh 不够熟悉,不知道是否存在这种触发器或如何执行它。


关于已接受解决方案的说明

对于那些对这个问题感兴趣的人来说,可接受的解决方案的意思是失败的命令不会存储在历史文件中。fc -l或者history证实了这一点。

然而,zsh-autosuggestions 插件似乎正在做自己的当地的缓存(或使用其他机制生成建议),因此它仍然会建议失败的命令,但是仅当会话尚未结束。当用户启动 shell 的新实例时,大概插件必须加载缓存的历史记录,它不再建议失败的命令(当然,除非您再次输入它们)。

提出的解决方案在技术上是正确的,因为我(错误地)以这样一种方式提出我的问题,它只需要一个答案来阻止 Zsh 存储失败的命令,并且接受的解决方案可以做到这一点(尽管方式有限;有关详细信息,请参阅解决方案中的链接)。

任何熟悉 shell 脚本(我不熟悉)并且有足够动力的人都可以查看zsh-autosuggestions 脚本

答案1

巴特·谢弗提出了以下方法同一问题zsh 用户邮件列表:

 zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }

此函数在命令行写入历史记录之前执行。如果它返回 1,则当前命令行既不会附加到历史记录文件,也不会附加到本地历史记录堆栈。但是,检查命令是否会触发找不到命令错误仅涵盖简单情况。例如,此行将出现在历史记录中:

echo foo; echooo bar

但对于你的例子来说它工作得很好

gut status

请注意,错误的命令将显示出来UP-ARROW(以便您可以纠正它!),但不在历史堆栈中;请使用 检查fc -l


此基本函数的一个可能的扩展是考虑在命令行中设置环境变量,例如DEBUG=1 ./some_prog。此处函数检查命令行上的单词是否包含等号,如果是,则检查下一个单词是否为有效命令:

 zshaddhistory() {
   local j=1
   while ([[ ${${(z)1}[$j]} == *=* ]]) {
     ((j++))
   }
   whence ${${(z)1}[$j]} >| /dev/null || return 1
 }

答案2

内置fc命令支持编辑历史记录。如果您输入错误(例如上一个命令),您可以输入以下命令:

$ fc -e nano -1

您可以nano用您喜欢的编辑器的命令替换。您也可以EDITOR在 zsh 配置中设置变量(参数)。(请参阅引用 SO 页面

您需要保存文件(由 fc 在系统临时文件夹中创建的文件)。保存后,您将得到编辑的行。Enter将运行它,或者您可以按Ctrl+C完成编辑。

有关更多详细信息,请参阅 zsh 文档:Zsh:编辑历史


如果你想编辑整个历史记录

$ fc -W; nano "$HISTFILE"; fc -R

...如果你愿意的话,可以再次替换 nano

它只是写出历史记录(包括缓存),然后用编辑器打开文件。

请注意了解三种类型的历史:

  • 内部的:您登录后输入的命令
  • 当地的:活动 shell 中可用的文件 - [HISTFILE + Internal]
  • “全球的”:这取决于,但可以说它是 HISTFILE 中设置的文件

请记住,如果您的历史文件被共享(SHARE_HISTORY) 并且您有多个 zsh shell 与相关用户一起打开,那么您最好fc -W先在这些 shell 中运行该命令。完成编辑后,再运行fc -R。否则,在这些 shell 中输入的命令将不会被存储,然后无法识别您对 的手动编辑HISTFILE

答案3

不确定 omz 如何运行它,但在 bash 和常规 zsh 中,以空格作为前缀可以使其脱离 .history,从而脱离自动完成/建议

IE

<space>ll -ahZ  /home/%USER

相关内容