如何让 Zsh 不存储失败的命令

lig*_*ist 15 linux zsh shell command-line oh-my-zsh

问题

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

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

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

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

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

我做了什么

我已经搜索过这个,与从历史记录中排除条目最接近的匹配是设置 HIST_IGNORE_SPACE,或者忽略特定命令的方法,或者在输入命令后手动删除命令。看到这个这个。但正如@Adaephon 52 所指出的,这发生行为完成之后。

我正在考虑做什么

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


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

对于那些对此问题感兴趣的人,已接受的解决方案的工作原理是失败的命令不会存储在历史文件中。fc -lhistory确认这一点。

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

建议的解决方案在技术上是正确的,因为我(错误地)以这样一种方式构建了我的问题,它只需要一个阻止 Zsh 存储失败命令的答案,而接受的解决方案就是这样做的(尽管方式有限;请参阅解决方案中的链接)细节)。

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

mpy*_*mpy 12

Bart Schaeferzsh 用户邮件列表上针对同一问题提出了以下方法

 zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }
Run Code Online (Sandbox Code Playgroud)

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

echo foo; echooo bar
Run Code Online (Sandbox Code Playgroud)

但它适用于您的示例

gut status
Run Code Online (Sandbox Code Playgroud)

请注意,错误的命令将显示在UP-ARROW(以便您可以更正!),但不在历史堆栈中;与fc -l.

  • @Daniel:在任何配置文件中 _zsh_ 都会在启动时读取,通常是你的 `~/.zshrc`。 (2认同)