我该如何让zsh在历史记录中排除特定命令?

6

比如说,那些包含“production”一词的?


如果你和我一样在寻找一种标记命令/别名的方法,以便将其从历史记录中过滤出来,那么 zsh 可以选择性地排除一些以空格开头的命令/别名:https://superuser.com/q/352788/1067306 - cassepipe
1个回答

8
function zshaddhistory() {
    emulate -L zsh
    if [[ $1 != *"production"* ]] ; then
        print -sr -- "${1%%$'\n'}"
        fc -p
    else
        return 1
    fi
}

将上述内容放入一个文件中,在交互式shell启动时作为源文件引用(例如.zshrc或从.zshrc引用的文件,就像我所做的那样)。
以下是可选形式(隐式添加到历史记录):
function zshaddhistory() {
    emulate -L zsh
    if [[ $1 = *"production"* ]] ; then
        return 1
    fi
}

注意:

print -sr -- "${1%%$'\n'}"

明确地将项添加到历史记录。如果zshaddhistory返回零退出码,则同样会由zsh隐式执行此操作,因此在没有fc -psetopt nohistignoredups nohistignorealldups的情况下(这是默认状态),您将在历史记录中看到不必要的重复项。

emulate -L zsh用于确保模拟设置不介入并更改函数体的解释。我在zsh配置中定义每个函数的开头都放置了此行。


5
这对我没用......我尝试了许多排列组合。我也测试过分支的输入是否正确(if条件是正确的)。但该命令仍然被记录在历史记录中。但这个可以:zshaddhistory() { [[ $1 != *production* ]] } - John Bachir
1
@John Bachir我犯了一个错误:我认为fc -p与将命令添加到历史记录有关(现在不确定它在这里的作用是什么)。你的变体有效是因为根据帮助文档如果任何钩子函数返回非零值,则历史记录行将不会保存,尽管它在历史记录中保留,直到执行下一行,使您可以立即重用或编辑它。 - ZyX
1
@Julian 看起来你需要删除那些行 或者 同时使用 print -srfc -p。因为如果不使用 fc -pprint 将会产生一个重复的条目(如果设置了 HIST_IGNORE_DUPS 选项,则该条目将被删除,因此大多数情况下您将看不到它)。也就是说,我的代码明确地向历史记录添加条目,删除它或用 return 0 替换它将隐式地执行相同的操作。 - ZyX
1
@Julian 我增加了更多的解释来更新这个答案。 - ZyX
1
@Rainy,你可能缺少LF,这就是为什么我的第一个函数包含${1%%$'\n'}的原因。 - ZyX
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接