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 -l或history确认这一点。
但是,似乎 zsh-autosuggestions 插件正在执行自己的本地缓存(或使用其他机制生成建议),因此它仍然会建议失败的命令,但前提是会话未结束。当用户启动 shell 的一个新实例时,大概是插件必须加载缓存的历史记录时,它不再建议失败的命令(当然,除非您再次输入它们)。
建议的解决方案在技术上是正确的,因为我(错误地)以这样一种方式构建了我的问题,它只需要一个阻止 Zsh 存储失败命令的答案,而接受的解决方案就是这样做的(尽管方式有限;请参阅解决方案中的链接)细节)。
任何熟悉 shell 脚本(我不是)并且有足够动力的人都可以查看zsh-autosuggestions 脚本。
mpy*_*mpy 12
Bart Schaefer在zsh 用户邮件列表上针对同一问题提出了以下方法:
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.
| 归档时间: |
|
| 查看次数: |
3941 次 |
| 最近记录: |