问题
我正在使用 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